Firebase井字棋示例中ndb与Cloud Datastore的使用及存储疑问
我来帮你理清这个问题的核心逻辑:
开发模式(dev mode)下的本地模拟器:当你用Python启动App Engine开发服务器时,它默认会启动一个本地Datastore模拟器,这时候ndb库会自动连接这个本地模拟器,而不是云端的Cloud Datastore。所以你在云端项目的Datastore里看不到数据,是因为所有Game模型的数据都存在你本地的模拟器里了。
ndb与Cloud Datastore的关联:没错,在正式部署到App Engine的生产环境时,ndb是作为Google Cloud Datastore的官方Python客户端库存在的——你的Game模型定义会映射到云端Datastore的实体,调用
put()、get()这类方法时,数据会直接读写云端的Datastore服务。查看本地模拟器的数据:开发模式下,你可以通过本地模拟器的控制台查看存储的Game数据,默认访问地址是
http://localhost:8000/datastore(如果你的开发服务器端口没改的话),在这里能看到所有通过ndb写入的实体。切换到云端Datastore(开发时可选):如果想在开发阶段直接操作云端Datastore,可以:
- 关闭本地Datastore模拟器(如果它在运行)
- 设置环境变量
DATASTORE_EMULATOR_HOST为空,让ndb直接连接云端 - 确保你的本地环境已经通过
gcloud auth login完成了身份验证,并且关联了正确的Google Cloud项目
不过这里提醒一下:开发时用本地模拟器更稳妥,既能避免产生不必要的云端费用,也不会污染生产环境的数据。
示例中ndb的具体用法:示例里的
Game模型是通过继承ndb.Model定义的,里面的board、player_x、player_o等属性对应Datastore实体的属性。当你在代码中创建Game实例并调用game.put()时,在dev mode下数据写入本地模拟器;部署到App Engine后,就会写入云端的Cloud Datastore了。
内容的提问来源于stack exchange,提问作者BrainPermafrost

