Cloud Firestore の Datastore モードでの使用

Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQL ドキュメント データベースです。これは Datastore の最新バージョンで、Datastore のいくつかの点が改善されています。

Datastore モードの Firestore は、サーバーのユースケースと App Engine 用に最適化されているため、主に App Engine アプリで使用されるデータベースには Datastore モードの Firestore を使用することをおすすめします。ネイティブ モードの Firestore は、モバイルとリアルタイムの通知のユースケースに最適です。Firestore モードの詳細については、ネイティブ モードと Datastore モードからの選択をご覧ください。

このドキュメントでは、Google Cloud Client Library を使用して Datastore モードのデータベースにデータを格納する方法、または Datastore モードのデータベースからデータを取得する方法について説明します。

前提条件と設定

App Engine の Python 用「Hello, World!」の説明に従って環境とプロジェクトを設定し、App Engine での Python アプリの構造を理解してください。このドキュメントで説明しているサンプルアプリを実行する際に必要となるため、プロジェクト ID をメモして保存しておきます。

リポジトリのクローン作成

サンプルをダウンロード(クローンを作成)します。

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible/datastore

プロジェクト構成の編集と依存関係の設定

google-cloud-datastore ライブラリを requirements.txt に追加します。これは、データストア モードのクライアント ライブラリです。

Flask==2.1.0; python_version > '3.6'
Flask==2.0.3; python_version < '3.7'
google-cloud-datastore==2.7.1
gunicorn==20.1.0

アプリケーション コード

このサンプル アプリケーションは訪問者の IP のログ記録、取得、表示を行います。ログエントリがタイプ visit の単純な 2 フィールド クラスであり、put コマンドを使用して Datastore モードに保存されることがわかります。query() コマンドを使用すると、最新 10 件の訪問者のアクセス情報を降順で取得できます。

@app.route('/')
def index():
    ds = datastore.Client()

    user_ip = request.remote_addr

    # Keep only the first two octets of the IP address.
    if is_ipv6(user_ip):
        user_ip = ':'.join(user_ip.split(':')[:2])
    else:
        user_ip = '.'.join(user_ip.split('.')[:2])

    entity = datastore.Entity(key=ds.key('visit'))
    entity.update({
        'user_ip': user_ip,
        'timestamp': datetime.datetime.now(tz=datetime.timezone.utc)
    })

    ds.put(entity)
    query = ds.query(kind='visit', order=('-timestamp',))

    results = []
    for x in query.fetch(limit=10):
        try:
            results.append('Time: {timestamp} Addr: {user_ip}'.format(**x))
        except KeyError:
            print("Error with result format, skipping entry.")

    output = 'Last 10 visits:\n{}'.format('\n'.join(results))

    return output, 200, {'Content-Type': 'text/plain; charset=utf-8'}

index.yaml ファイルの使用

このサンプルアプリは簡単なクエリを実行しています。複雑な Datastore クエリには 1 つ以上のインデックスが必要です。インデックスは、アプリとともにアップロードする index.yaml ファイルで指定する必要があります。

ローカルテスト

アプリケーションを開発してローカルでテストする必要がある場合は、Datastore モードエミュレータを使用できます。

詳細情報

最適化やコンセプトなどの Datastore モードの詳細は、Datastore モードの Firestore に関するドキュメントをご覧ください。