Cloud Datastore 模拟器可在本地模拟 Datastore 生产环境。我们正逐步在更大范围内推出 Cloud Datastore 模拟器,它将是 dev_appserver 的默认 Datastore 实现。
迁移到 Datastore 模拟器的优势
Datastore 模拟器可以在 App Engine 标准环境客户端库(如 DB 和 NDB)与 Cloud Datastore 客户端库之间共享。
您可以使用 Datastore 模拟器在运行于 App Engine 标准环境和 App Engine 柔性环境的服务之间共享本地数据。
前期准备
下载并安装 Java 运行时环境 (JRE) 版本 11 或更高版本。
从
google-cloud-sdk/bin
目录运行 dev_appserver。
选择模拟环境
Cloud Datastore 模拟器是一部分 dev_appserver 用户的默认模拟器。如果您使用的是 Cloud Datastore 模拟器,dev_appserver 将显示:
... Using Cloud Datastore Emulator.
您可以通过在启动 dev_appserver.py
时将 --support_datastore_emulator
标志设置为 true 来强制 dev_appserver 使用 Cloud Datastore 模拟器:
python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --support_datastore_emulator=[true|false] app.yaml
将 DEVAPPSERVER_ROOT 替换为您在其中解压缩 devapp_server.py
的归档版本的文件夹的路径。如需详细了解如何下载和使用 dev_appserver.py
的归档版本,请参阅使用本地开发服务器。
将 dev_appserver 与 Datastore 模拟器搭配使用
Dev_appserver 会根据 DATASTORE_EMULATOR_HOST
环境变量决定是否启动模拟器。
如果存在此环境变量,dev_appserver 将与在
DATASTORE_EMULATOR_HOST
上运行的现有模拟器进程进行通信。如果不存在此环境变量,dev_appserver 将启动新的模拟器进程。您可以在启动 dev_appserver.py 时设置
--datastore_emulator_port
,以指定 Datastore 模拟器端口。
行为变更
本地数据格式转换
目前,本地 Datastore 模拟器将数据存储在 sqlite3 中,而 Cloud Datastore 模拟器将数据存储为 Java 对象。
如果 dev_appserver 是通过旧版 sqlite3 数据启动的,该数据将转换为 Java 对象。系统会使用文件名 {original-data-filename}.sqlitestub 来备份原始数据。
本地数据文件位置
您可以使用 --datastore_path
标志指定本地数据文件。
如果 dev_appserver 启动模拟器,该位置将保持不变。
如果 dev_appserver 使用现有的 Cloud Datastore 模拟器,该标志将被忽略,取而代之的是模拟器的设置。
本地 index.yaml
空白 index.yaml 将被视为无效。index.yaml 的语法采用 YAML 格式。index.yaml 文件包含单个名为 indexes 的列表元素。
如果 dev_appsever 启动模拟器,index.yaml 将保留在应用项目目录中。
如果 dev_appserver 使用现有的 Cloud Datastore 模拟器,index.yaml 将由该模拟器管理。
其他本地 Datastore 服务器功能将保持不变。
问题排查
获取模拟器输出
默认情况下,dev_appserver 以静默模式运行 Datastore 模拟器。要查看 Datastore 模拟器的输出,请使用 --dev_appserver_log_level=debug
运行 dev_appserver。
gRPC 导入失败
dev_appserver 使用 gRPC 与 Cloud Datastore 模拟器进行通信。gcloud CLI 会打包 gRPC,但打包的版本与某些操作系统不兼容,因而导致导入失败。
要修复导入失败的问题,您可以在 gcloud CLI 219.0.0 或更高版本中使用 pip
单独安装 gRPC:
pip install grpcio