使用 Datastore 模式 Firestore (Datastore)

Firestore 是一个 NoSQL 文档数据库,能够自动扩缩、具备出色的性能,并且易于进行应用开发。Firestore 是 Datastore 的最新版本;与 Datastore 相比,这个新版本引入了多项改进功能。 由于 Datastore 模式 Firestore (Datastore) 针对服务器用例和 App Engine 进行了优化,因此我们建议使用 Datastore 来处理主要将由 App Engine 应用使用的数据库。原生模式 Firestore 最适合移动和实时通知用例。如需详细了解 Firestore 模式,请参阅选择原生模式或 Datastore 模式

本文档介绍了如何使用 Cloud 客户端库在 Datastore 模式数据库中存储和检索数据。

前提条件和设置

  • 设置您的环境和项目以了解应用在 App Engine 中的结构。记录并保存项目 ID,因为您需要用它来运行本文档中介绍的示例应用。

克隆代码库

下载(克隆)示例:

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

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

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

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

本地测试

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

了解详情

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