我正在Windows 7上运行Google App Engine devserver 1.3.3。
通常,这种方法运行正常,但这次它给出了一个错误:
def _deleteType(type):
results = type.all().fetch(1000)
while results:
db.delete(results)
results = type.all().fetch(1000)
错误:
File "src\modelutils.py", line 38, in _deleteType
db.delete(results)
File "C:\Program Files\Google\google_appengine\google\appengine\ext\db\__init__.py", line 1302, in delete
datastore.Delete(keys, rpc=rpc)
File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore.py", line 386, in Delete
'datastore_v3', 'Delete', req, datastore_pb.DeleteResponse(), rpc)
File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore.py", line 186, in _MakeSyncCall
rpc.check_success()
File "C:\Program Files\Google\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 474, in check_success
self.__rpc.CheckSuccess()
File "C:\Program Files\Google\google_appengine\google\appengine\api\apiproxy_rpc.py", line 149, in _WaitImpl
self.request, self.response)
File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore_file_stub.py", line 667, in MakeSyncCall
response)
File "C:\Program Files\Google\google_appengine\google\appengine\api\apiproxy_stub.py", line 80, in MakeSyncCall
method(request, response)
File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore_file_stub.py", line 775, in _Dynamic_Delete
self.__WriteDatastore()
File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore_file_stub.py", line 610, in __WriteDatastore
self.__WritePickled(encoded, self.__datastore_file)
File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore_file_stub.py", line 656, in __WritePickled
os.rename(tmpfile.name, filename)
WindowsError: [Error 183] Cannot create a file when that file already exists
我做错了什么?这次怎么可能失败,但通常不会?
更新我重新启动了devserver,当它重新联机时,数据存储空了。
答案 0 :(得分:3)
不幸的是,1.3.3让我无法查看其来源并尝试精确诊断您的问题 - SDK没有1.3.3版本标记,我无法猜测{{1}的哪个版本在1.3.3中。你可以升级到当前版本1.3.5,然后再试一次吗?不建议运行旧版本(特别是2+版本),因为它们可能与Google实际服务器上实际可用的版本有点不同步(和/或有更新版本中修复的错误)。总之...
在Windows上,如果目标存在,则datastore_filestub.py
不起作用 - 但我看到的修订会小心捕捉到os.rename
结果(OSError
派生自它),删除现有文件,并尝试重新命名。所以我不知道什么可以解释你的错误 - 如果你运行的SDK的来源有那么谨慎的安排,我认为他们这样做。
另外,我建议WindowsError
(请参阅Nick Johnson的博客宣布它here)代替SDK数据存储区的文件存根 - 它似乎更有意义! - )
答案 1 :(得分:1)
(免责声明:我不是在回答您的问题,而是帮助您优化正在运行的代码)
您的代码似乎正在大量删除对象。在SDK / dev服务器中,您可以使用此命令完成擦除数据存储区作为更快捷,更方便的替代方法:
$ dev_appserver.py -c helloworld
现在,也就是说,如果要擦除整个SDK数据存储区。如果没有,那么当然不要使用它。 : - )
更重要的是,如果您将查询更改为以下内容,则可以使代码运行更快并在生产中使用更少的CPU:
results = type.all(keys_only=True).fetch(SIZE)
这与您的工作方式相同,只是它只提取密钥,因为您不需要从数据存储区检索完整实体以删除它们。此外,您的代码目前正在设置SIZE=1000
,但您可以将其设置为大于此值,尤其是如果你知道你的系统中有多少个实体......在1.3.1 http://bit.ly/ahoLQp
一个小问题...尽量不要使用type
作为变量名...这是Python中最重要的导入对象和内置/工厂函数之一。如果这样做,你的代码可能会变得奇怪 - 在你的情况下,它只是稍微好一点,因为你在一个函数/方法中,但这不会是一个全局变量。
希望这有帮助!