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

时间:2010-07-02 02:41:39

标签: python google-app-engine

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

2 个答案:

答案 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

中取消了1000个结果限制

一个小问题...尽量不要使用type作为变量名...这是Python中最重要的导入对象和内置/工厂函数之一。如果这样做,你的代码可能会变得奇怪 - 在你的情况下,它只是稍微好一点,因为你在一个函数/方法中,但这不会是一个全局变量。

希望这有帮助!