我在 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
我做错了什么?这次怎么会失败,但通常不会失败?
更新 我重新启动了开发服务器,当它重新联机时,数据存储区是空的。
请您参考如下方法:
不幸的是,1.3.3 太早了,我无法查看其来源并尝试准确诊断您的问题 - SDK 没有 1.3.3 发布标签,我无法猜测 datastore_filestub 的哪个版本.py 在 1.3.3 中。你能升级到当前版本,1.3.5,然后再试一次吗?不建议运行旧版本(特别是 2+ 版本),因为它们可能与 Google 实际服务器上实际可用的内容有点不同步,无论如何(和/或有在更高版本中修复的错误)。无论如何...
在 Windows 上,如果目标存在,os.rename 将不起作用——但我看到的修订非常小心地捕获了导致的 OSError( WindowsError 派生自它),删除现有文件,然后再次尝试重命名。所以我不知道什么可以解释你的错误——如果你运行的 SDK 的源代码有那么仔细的安排,我认为他们有。
另外,我建议使用 --use_sqlite(参见 Nick Johnson 的博客宣布它 here)代替 SDK 数据存储的文件 stub - 它似乎更有意义!-)
