2010-07-02 56 views
2

我在Windows上運行的谷歌應用程序引擎devserver 1.3.3 7.谷歌應用程序引擎:「不能創建一個文件時,該文件已存在」

通常情況下,這種方法效果很好,但這次它給錯誤:

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 

我在做什麼錯?這次怎麼會失敗,但通常情況並非如此?

UPDATE我重新啓動了devserver,當它重新聯機時,數據存儲區爲空。

回答

3

不幸的是,1.3.3對我來說太遙遠了,無法確定它的來源並嘗試正確地診斷您的問題--SDK沒有1.3.3版本標籤,我無法猜測datastore_filestub.py的哪個版本在1.3.3。你能升級到當前版本1.3.5,然後再試一次嗎?不建議運行舊版本(尤其是2+版本),因爲它們可能會與Google實際服務器上實際可用的內容略有不同步(無論如何(和/或有更新版本中已修復的錯誤)。無論如何...

在Windows上,os.rename不起作用,如果目的地存在 - 但我看到的修訂是仔細趕上OSError結果(WindowsError派生自它),刪除現有的文件,並嘗試重命名再次。所以我不知道什麼可以解釋你的bug - 如果你正在運行的SDK的源代碼有這樣的仔細安排,而且我認爲它們確實如此。

另外,我建議你到--use_sqlite(見尼克·約翰遜的博客宣佈它here)代替文件存根爲你的SDK數據存儲的 - 它只是似乎更有意義 - )

+0

好的,我會做到這一點。另外,如果我運行的是Python 2.6,它與GAE的兼容性有多糟? – 2010-07-02 05:18:45

+0

@Rosarch,在本地SDK中使用2.6可以以微妙和意想不到的方式讓你受到影響,但更糟糕的是,它可以讓你在你的SDK上編寫代碼並運行一些東西,當你上傳你的代碼時,它會以更難找到的方式破解代碼到谷歌 - 我**強烈建議安裝一個2.5 GAE使用(可以與現有的2.6「並排」完成,你只需要設置不同的PATH或更明確)。 – 2010-07-02 05:40:25

1

(免責聲明:我不回答你的問題,但幫助你優化你正在運行的代碼)

你的代碼似乎是大規模刪除對象。現在

$ dev_appserver.py -c helloworld 

,也就是說,如果你想消滅你的整個數據存儲SDK:在SDK/dev的服務器,你可以做到消滅使用此命令爲更快,更方便的選擇數據存儲。如果不是,那麼當然,不要使用它。 :-)

更重要的是,你可以讓你的代碼的運行速度更快,生產更少的CPU,如果你改變你的查詢是這樣的:

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

這個作品相同,您的不同之處只取因爲您不需要從數據存儲檢索完整實體以刪除它們。此外,您的代碼目前正在設置SIZE=1000,但您可以將其設置爲大於,尤其是,如果您對系統中有多少個實體有所瞭解...... 1000個結果限制被解除1.3.1 http://bit.ly/ahoLQp

一個小問題......儘量不要使用type作爲變量名...這是Python中最重要的對象和內置/工廠函數之一。你的代碼可能會奇怪,如果這樣做 - 在你的情況下,它只是在一定程度上更好,因爲你在一個函數/方法中,但這不會成爲一個全局變量。

希望這有助於!

+0

感謝您的意見。我沒有意識到「類型」將被保留。 – 2010-07-03 17:05:57

+1

當然,np!但是,它不是「保留」或關鍵字,因此您可以合法使用它的原因。這是所有Python用戶需要注意的一件事情。類型,範圍,目錄,幫助,isinstance,列表等內置名稱都是「導入的」(儘管是自動的),所以它們就像您可以替換的全局變量一樣。 – wescpy 2010-07-03 19:41:37

相關問題