在 Datastore 模式下使用 Cloud Firestore

Firestore 是一个 NoSQL 文档数据库,能够自动扩缩、具备出色的性能,并且易于进行应用开发。Firestore 是 Datastore 的最新版本;与 Datastore 相比,这个新版本引入了多项改进功能。

由于 Datastore 模式 Firestore 针对服务器用例和 App Engine 进行了优化,因此,对于主要将由 App Engine 应用使用的数据库,我们建议使用 Datastore 模式 Firestore。原生模式 Firestore 最适合移动和实时通知用例。如需详细了解 Firestore 模式,请参阅选择原生模式或 Datastore 模式

本文档介绍了如何使用 Google Cloud 客户端库将数据存储在 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

修改项目配置并设置依赖项

requirements.txt 中添加 google-cloud-datastore 库。这是 Datastore 模式的客户端库。

Flask==2.0.1
google-cloud-datastore==2.2.0
gunicorn==20.1.0

应用代码

示例应用会记录、检索和显示访问者的 IP。您会看到,有一条日志条目是一个类型为 visit 的简单双字段类,并使用 put 命令保存到 Datastore 模式。然后,使用 query() 命令按降序检索最近的十条访问记录。

@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.utcnow()
    })

    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 模式查询需要使用一个或多个索引,您必须在随应用一起上传的 index.yaml 文件中指定这些索引。此文件可以手动创建,也可以在本地测试应用时自动生成。

本地测试

如果您需要在本地开发和测试应用,则可以使用 Datastore 模式模拟器

了解详情

如需全面了解 Datastore 模式(包括优化和概念),请参阅 Datastore 模式 Cloud Firestore 文档