python - 我可以在不先 db.getting 的情况下 db.put 模型吗?

标签 python google-app-engine

我尝试做类似的事情

ss = Screenshot(key=db.Key.from_path('myapp_screenshot', 123), name='flowers') db.put([ss, ...])

它似乎在我的 dev_appserver 上工作,但在现场我得到了这个回溯:

05-07 09:50PM 19.964 File "/base/data/home/apps/quixeydev3/12.341796548761906563/common/appenginepatch/appenginepatcher/patch.py", line 600, in put
E 05-07 09:50PM 19.964 result = old_db_put(models, *args, **kwargs) GAE bug is actually extremely minor. It seems to be due to the fact that I called something l E 05-07 09:50PM 19.964 File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/init.py", line 1278, in put
E 05-07 09:50PM 19.964 keys = datastore.Put(entities, rpc=rpc)

E 05-07 09:50PM 19.964 File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 284, in Put
E 05-07 09:50PM 19.965 raise _ToDatastoreError(err)

E 05-07 09:50PM 19.965 InternalError: the new entity or index
you tried to insert already exists

我碰巧只知道我想要更新的现有屏幕截图实体的 ID;这就是我手动构建其 key 的原因。我做错了吗?

更新:我将其归档为 Google App Engine issue 3209 .

更新 2: 它看起来像 ike db.put([ss, ss2, ss]),即当列表引用同一模型两次时调用就会失败。

更新 3: 好的,我想我终于知道这里发生了什么,我正在更新这个问题,因为现在这是“您尝试的新实体或索引”的唯一 Google 结果插入已存在”。

当数据存储在同一远程过程调用中尝试对同一实体键两次写入 BigTable 行时,似乎会出现此内部错误。如果您手动为两个实体提供相同的 key ,或者如果您 p​​ut() 两个新实体而不指定 key ,并且相同的 ID 并行分配给两个实体,则可能会发生这种情况。对于后一种情况,解决方案是使用 db.allocate_ids()。

最佳答案

这是一个错误 - 您应该能够准确地执行您所描述的操作。在我们修复此问题之前,作为一种解决方法,使用键名(即使它们是数字)而不是 ID 应该可以正常工作。

关于python - 我可以在不先 db.getting 的情况下 db.put 模型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2792999/

相关文章:

google-app-engine - 无法访问本地主机上的 API 资源管理器

node.js - Redis:按分数排序的集合的交集

java - 为什么 App Engine Web 应用程序会意外终止?

python - 谷歌应用引擎 1.4.3 和 django 1.2 上的 i18n

python 网络服务 : returning a fault from the server using ZSI

python - 如何在我的 docker 镜像中安装 python-tk

python - 终端无法在 Ubuntu 18.04 中启动

python - cv2.convexityDefects 错误

go - 如何仅将一个文件部署到Google App Engine?

python - 如何使用pyinstaller将多个子进程python文件编译成单个.exe文件