繁体   English   中英

Google App Engine:“文件已经存在时无法创建”

[英]Google App Engine: “Cannot create a file when that file already exists”

我正在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,当它重新联机时,数据存储为空。

不幸的是,对于我而言,1.3.3太遥远了,无法查看其源代码并尝试准确地诊断您的问题-SDK没有1.3.3发行标签,而且我无法猜到datastore_filestub.py哪个版本在1.3中。 3。 您可以升级到当前版本1.3.5,然后重试吗? 不建议运行旧版本(尤其是2个以上的版本),因为它们可能会与Google实际服务器上实际可用的版本有点不同步(和/或存在在更高版本中已修复的错误)。 无论如何...

在Windows上,如果目标存在,则os.rename不起作用-但我看到的修订很小心地捕获导致的OSErrorWindowsError源自此),删除现有文件,然后尝试重命名。 因此,我不知道是什么原因可以解释您的错误-如果您所运行的SDK的源经过精心安排,我认为它们确实可以。

另外,我建议--use_sqlite (请参阅Nick Johnson的博客在此处宣布)代替SDK数据存储区的文件存根-似乎更有意义!

(免责声明:我不是在回答您的问题,而是帮助您优化正在运行的代码)

您的代码似乎正在大量删除对象。 在SDK / dev服务器中,您可以使用此命令完成擦除数据存储的操作,这是一种更快,更方便的替代方法:

$ dev_appserver.py -c helloworld

现在,也就是说,如果您要擦除整个SDK数据存储区。 如果没有,那么当然不要使用它。 :-)

更重要的是,如果将查询更改为以下内容,则可以使代码运行更快,并在生产中使用更少的CPU:

results = type.all(keys_only=True).fetch(SIZE)

这与您的密钥的工作原理相同,只是它只获取密钥,因为您不需要从数据存储中检索完整实体来删除它们。 同样,您的代码当前设置为SIZE=1000 ,但是您可以使其大于该值,尤其是。 如果您对系统中有多少个实体有所了解... 1000结果限制已在1.3.1 http://bit.ly/ahoLQp中取消

一个小技巧...尽量不要使用type作为变量名...这是Python中最重要的导入对象和内置/工厂函数之一。 如果这样做,您的代码可能会表现得很奇怪-在您的情况下,由于您位于函数/方法内部,因此它的性能仅会好一些,但是作为全局变量,这并不正确。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM