Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以在没有db的情况下先放置模型吗?_Python_Google App Engine - Fatal编程技术网

Python 我可以在没有db的情况下先放置模型吗?

Python 我可以在没有db的情况下先放置模型吗?,python,google-app-engine,Python,Google App Engine,我试着做一些类似的事情 ss=Screenshot(key=db.key.from_path('myapp_Screenshot',123),name='flowers') db.put([ss,…]) 它似乎在我的dev_appserver上工作,但在live上我得到了以下回溯: 05-07 09:50PM 19.964文件“/base/data/home/apps/quixeydev3/12.341796548761906563/common/appenginepatch/appengine

我试着做一些类似的事情

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

它似乎在我的dev_appserver上工作,但在live上我得到了以下回溯:

05-07 09:50PM 19.964文件“/base/data/home/apps/quixeydev3/12.341796548761906563/common/appenginepatch/appenginepatcher/patch.py”, 第600行,输入
E 05-07 09:50PM 19.964结果=旧数据输入(型号,*args,**kwargs) GAE错误实际上是非常轻微的。这似乎是因为我把某件事叫做l E 05-07 09:50PM 19.964文件“/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/init.py”, 第1278行,输入
E 05-07 09:50PM 19.964 keys=datastore.Put(entities,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;这就是为什么我要手动构造它的键。我做错了吗

更新:我将此作为谷歌应用程序引擎提交

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

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

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

我很确定您可以只使用ss.save()即可

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


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

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


因此,您将执行
ss.put()

这是一个bug-您应该能够完全按照您所描述的操作。作为一种解决方法,在我们能够修复它之前,使用键名(即使它们是数字)而不是ID应该可以很好地工作。

谢谢,但我非常确定db.put()应该是进行批量更新的方法。我负担不起为每个实体分别访问数据存储。哦,也许可以尝试在没有任何参数的集合上执行put。你说的“没有任何参数”是什么意思?这和我的问题代码有什么不同?我告诉你的正是Emilien告诉你的。我不知道它是否会起作用,但让我们先说一下:ss=Screenshot(key=db.key.from_path('myapp_Screenshot',123),name='flowers'),而不是尝试将记录从ss插入db(db.put(ss,…),尝试将集合本身放入。ss.put()。如果一次只查询一个,那么“批量更新”没有任何好处。但是您可以尝试通过收集变量中的对象并发送put()来实现这一点。如上所述,这两种方法之间的行为完全没有区别。不幸的是,我必须批量进行更新。我想知道是否有人确切地知道问题中的错误意味着什么,因为谷歌对此没有任何结果。为什么“必须批量更新”?如果是出于性能原因(即未达到最大请求时间),则最好使用脱机处理,并为每个要更新的实体添加任务(使用任务队列)。这样,即使有一百万个实体需要更新,也不会达到时间限制。如果时间不是约束条件,请使用事务(如果put()的实体属于同一个实体组,则db.put也会这样做)。调用Model.put的行为应该与db.put的行为相同,因此这不是问题所在。是否存在此问题?我可能在搜索它时忽略了它,但我想把它作为明星。如果你找不到,请提交一个新的bug!谢谢,现在我为自己打破了伟大的GAE平台而感到自豪:)我不能使用密钥名作为解决办法,因为我仍然希望数据存储自动生成唯一的ID。我还是不明白我到底做了什么才触发了这个错误。我猜这是我对实体键的手动设置,我可以通过先执行get()并让GAE构造键来解决这个问题;我也给它加了星星:)@Liron在最坏的情况下,你可以使用allocate_ids调用来请求一个ID,然后将其字符串化并将其设置为密钥名,但我同意这是一个可怕的黑客行为。