代码之家  ›  专栏  ›  技术社区  ›  Liron Shapira

我可以把没有数据库的模型放在第一位吗?

  •  1
  • Liron Shapira  · 技术社区  · 16 年前

    我试着做一些像

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

    它似乎在我的dev_appserver上有效,但在Live上,我得到了以下跟踪:

    05-07 09:50pm 19.964 file“/base/data/home/apps/quixeydev3/12.341796548761906563/common/appenginepatch/appenginepatcher/patch.py”, 第600行,输入
    E 05-07 09:50pm 19.964结果=旧的输入(型号,*参数,**kwargs) gae bug实际上非常小。似乎是因为我打了个电话 E 05-07 09:50pm 19.964文件“/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/ 初始化 “,” 1278行,输入
    E 05-07 09:50pm 19.964 keys=datastore.put(实体,rpc=rpc)

    E 05-07 09:50pm 19.964文件“/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py”, 284行,输入
    E 05-07 09:50pm 19.965提高到数据存储错误(err)

    E 05-07 09:50PM 19.965内部错误:新实体或索引
    您试图插入的内容已经存在

    我刚好知道我要更新的现有屏幕截图实体的ID;这就是我手动构造其键的原因。我做错了吗?

    更新: 我把它作为谷歌应用引擎归档 issue 3209 .

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

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

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   Nick Johnson    16 年前

    这是一个错误-你应该能够做你所描述的。作为一个解决方法,直到我们可以修复它,使用键名(即使它们是数字的)而不是ID应该可以正常工作。

        2
  •  0
  •   Emilien    16 年前

    如果只想更新一个实体,可以使用 Model.put() 而不是 db.put() . 如果实体尚不存在,则会创建该实体,如果存在,则会更新该实体。

    所以你会的 ss.put() .

        3
  •  0
  •   Gabriel    16 年前

    我很确定你可以只用ss.save()。

    基本上,您的db实体已经存在,所以您只需保存对它的更改,db.put用于添加新实体。希望有帮助。

    显然这是一个虫子。我对它做了更多的研究,发现了一些对实体组的引用,这些实体组允许在一个事务中修改多个实体,但是它们声明它们对查询速度没有显著的影响。