从Google Cloud Datastore导数据至本地模拟器的KeyProperty问题咨询
解决Google Cloud Datastore线上数据导入本地模拟器的KeyProperty app_id前缀问题
问题背景
我尝试把线上Datastore的数据导出后导入本地模拟器做测试,按流程操作后虽然能看到所有实体,但带KeyProperty的实体完全无法正常工作——原因是导出的Key值里的app_id被自动加上了b~前缀(比如b~my-app-id),而本地模拟器使用的是不带前缀的原始app-id,直接导致键映射不匹配。
我最初的操作流程是:
- 导出线上实体:
gcloud datastore export gs://<mybucket> - 将导出内容复制到本地文件夹:
gsutil -m cp -r gs://<mybucket>/<backup_folder> <local_folder> - 导入到本地Datastore模拟器:
curl -X POST localhost:<emulator_port>/v1/projects/<app-id>:import -H 'Content-Type: application/json' -d '{"input_url":"<local_folder>/<file>.overall_export_metadata"}' - 启动本地开发服务器:
dev_appserver.py --support_datastore_emulator=true --application <app-id>
解决方法
核心思路就是批量替换导出备份文件里的b~<app-id>为纯<app-id>,具体步骤如下:
- 进入本地备份文件夹:
cd <local_folder> - 批量替换所有相关文件中的前缀:
- 如果你用Linux/macOS,用
sed命令批量处理:
注意:GNU sed(Linux环境下)不需要# 处理元数据文件 sed -i '' 's/b~<app-id>/<app-id>/g' **/*.{metadata,overall_export_metadata,export_metadata} # 处理实体数据的ndjson文件 sed -i '' 's/b~<app-id>/<app-id>/g' **/*.ndjson-i后面的空引号,直接写sed -i 's/.../.../g' ...即可。 - 如果你用Windows,用PowerShell命令批量处理:
Get-ChildItem -Recurse -Include *.metadata,*.overall_export_metadata,*.export_metadata,*.ndjson | ForEach-Object { (Get-Content $_) -replace 'b~<app-id>', '<app-id>' | Set-Content $_ }
- 如果你用Linux/macOS,用
- 重新执行之前的导入curl命令,再启动dev_appserver.py,这时候带KeyProperty的实体就能正常匹配键值、正常工作了。
额外说明
为什么会出现b~前缀?这是因为采用App Engine标准环境的Google Cloud项目,其Datastore实体的Key会自动带上b~前缀(代表bucketed namespace),但本地模拟器并不会使用这个前缀,所以必须手动修正才能让键值匹配。
内容的提问来源于stack exchange,提问作者nAv
相关产品推荐
相关产品推荐

