用例:我正在python中开发一个appengine标准应用程序,另一个正在开发中。我希望同一数据存储区中的两个应用程序中的实体。这可能吗?
当我使用标志--support_datastore_emulator=true
和特定--datastore_path
启动第一个dev_appserver.py时,gcloud beta emulators datastore env-init
命令失败并显示
ERROR: (gcloud.beta.emulators.datastore.env-init) Unable to find env.yaml in the data_dir [~/.config/gcloud/emulators/datastore]. Please ensure you have started the appropriate emulator.
答案 0 :(得分:2)
是的,这是可能的,但您需要仔细设置。
首先要记住的是,只有一个仿真过程(无论是模拟器本身还是开发服务器)应该处理某个数据存储模拟目录,同时运行多个仿真过程很可能会导致数据损坏,就像你一样可能已经观察到尝试运行共享相同--datastore_path
配置的2个开发服务器。
因此,您只需要一个处理存储目录的数据存储模拟器进程。您不希望开发服务器(也能够或以独立的方式运行自己的数据存储模拟)处理该存储目录,因此您不应该使用--datastore_path
他们的选择。相反,开发服务器应该只与数据存储模拟器进程通信以进行所有数据存储访问。
当您启动数据存储模拟器进程时,您将在其日志中看到一行指定您需要传递给要共享该数据存储模拟实例的所有开发服务器的DATASTORE_EMULATOR_HOST
环境变量:
[datastore] API endpoint: http://0.0.0.0:5555
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore]
[datastore] export DATASTORE_EMULATOR_HOST=0.0.0.0:5555
[datastore]
[datastore] Dev App Server is now running.
因此,在要启动开发服务器的shell中设置该环境变量,然后使用这些与数据存储区相关的选项启动服务器:
export DATASTORE_EMULATOR_HOST=0.0.0.0:555
[.../]dev_appserver.py --support_datastore_emulator=true ...
这个env var是你唯一不需要在这里运行gcloud beta emulators datastore env-init
的东西,
在服务器的日志中,您应该看到如下所示的行:
警告2018-06-14 13:54:41,238 api_server.py:581]检测到的环境变量DATASTORE_EMULATOR_HOST = 0.0.0.0:5555,dev_appserver将与在此地址上运行的Cloud Datastore模拟器通话。 datastore_path /some_path_you_may_have_used_before/datastore.db将被忽略。 如果您希望数据存储区存储在/some_path_you_may_have_used_before/datastore.db上,请从环境变量中删除DATASTORE_EMULATOR_HOST并重新启动dev_appserver
当开发服务器进行第一次数据存储访问时,您将在数据存储模拟器日志中看到一些条目,如下所示:
[datastore] Jun 14, 2018 10:02:53 AM io.gapi.emulators.grpc.GrpcServer$3 operationComplete
[datastore] INFO: Adding handler(s) to newly registered Channel.
[datastore] Jun 14, 2018 10:02:53 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
[datastore] INFO: Detected HTTP/2 connection.
如果DATASTORE_EMULATOR_HOST
没有指向正在运行的数据存储模拟器进程(或者与之通信有问题),您将在开发服务器中看到错误&#39 ; s日志,可能与这些相似:
ERROR 2018-06-14 14:39:08,026 api_server.py:373] Exception while handling datastore_v3.Get()
Traceback (most recent call last):
File "/home/usr_local/google-cloud-sdk-204.0.0/platform/google_appengine/google/appengine/tools/devappserver2/api_server.py", line 333, in _handle_POST
response = service_stub.MakeSyncCallForRemoteApi(request)
File "/home/usr_local/google-cloud-sdk-204.0.0/platform/google_appengine/google/appengine/tools/devappserver2/datastore_grpc_stub.py", line 190, in MakeSyncCallForRemoteApi
request_pb, _TIMEOUT)
File "/home/usr_local/google-cloud-sdk-204.0.0/platform/google_appengine/lib/grpcio-1.9.1/grpc/_channel.py", line 487, in __call__
return _end_unary_response_blocking(state, call, False, deadline)
File "/home/usr_local/google-cloud-sdk-204.0.0/platform/google_appengine/lib/grpcio-1.9.1/grpc/_channel.py", line 437, in _end_unary_response_blocking
raise _Rendezvous(state, None, None, deadline)
_Rendezvous: <_Rendezvous of RPC that terminated with (StatusCode.UNAVAILABLE, Connect Failed)>
更多信息:
注意:(至少目前)只有Google Cloud SDK开发服务器(我使用204.0.0
测试的最新版本)支持与独立数据存储模拟器(GAE-)进行通信特定的SDK不是(或至少我目前正在使用的1.9.69
python)。来自Migrating to the Cloud Datastore Emulator:
注意:此迁移需要使用Google Cloud SDK-based tooling。