谷歌应用引擎:“当文件已经存在时,无法创建该文件”

2024-04-24 01:10:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Windows7上运行googleappenginedevserver1.3.3。在

通常,此方法工作正常,但这一次却出现了错误:

def _deleteType(type):
    results = type.all().fetch(1000)
    while results:
        db.delete(results)
        results = type.all().fetch(1000)

错误:

^{pr2}$

我做错什么了?这一次怎么会失败,但通常不会?在

UPDATE我重新启动了devserver,当它重新联机时,数据存储是空的。在


Tags: 方法dbdeftype错误updatefetchall
2条回答

不幸的是,1.3.3太晚了,我无法查看它的源代码并尝试精确地诊断您的问题-SDK没有1.3.3的发布标记,我无法猜测1.3.3中的datastore_filestub.py的哪个版本。能否升级到当前版本1.3.5,然后重试?不建议运行旧版本(尤其是2+版本),因为它们可能与Google实际服务器上的实际版本不同步(和/或有在以后版本中修复的bug)。不管怎样。。。在

在Windows上,os.rename不起作用,如果目标存在,但是我看到的修订小心地捕捉到结果的OSErrorWindowsError从中派生),删除现有文件,然后重新尝试重命名。所以我不知道如果你正在运行的SDK的源代码有这么仔细的安排,我想他们会这样做的话,你的bug会被什么解释。在

另外,我建议使用 use_sqlite(参见nickjohnson的博客宣布了这一点here),而不是SDK数据存储的文件存根-这似乎更有意义!-)在

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

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

$ dev_appserver.py -c helloworld

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

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

^{pr2}$

它的工作原理与您的相同,只是它只获取密钥,因为您不需要从数据存储中检索完整的实体来删除它们。另外,您的代码当前正在设置SIZE=1000,但您可以将其设置得更大,特别是如果您知道系统中有多少实体。。。1000个结果限制在1.3.1http://bit.ly/ahoLQp中被取消

一点点。。。不要使用type作为变量名。。。这是Python中最重要的导入对象和内置/工厂函数之一。如果你这样做的话,你的代码可能会有点奇怪,因为你在一个函数/方法里面,它只会稍微好一点,但是作为一个全局变量,这不是真的。在

希望这有帮助!在

相关问题 更多 >