2011-05-11 40 views
2

我試圖讓一個事務在AppEngine中工作,並且遇到了實體組的問題。我的代碼有點像這樣:Google AppEngine實體組和事務

parent_obj = ClassA.all().get() 

def txn(): 
    key_name = 'hash of something here' 

    if not db.get(db.Key.from_path('ClassB', key_name, parent=parent_obj)): 
    obj = ClassB(
     parent = parent_obj 
    ) 
    obj.put() 

db.run_in_transaction(txn) 

......但我得到'無法在事務中的不同實體組上操作'錯誤。我不明白的是,據我所見,我的交易只能在同一組中的實體上操作。也就是說,第6行查詢的「父」與第8行中設置的「父」相同,因此這兩個查詢都與同一個實體組有關。

我只能斷定我對實體組的理解是錯誤的。但是如何?我已經多次閱讀過文檔,但仍然沒有看到我所做的是錯的。

任何想法?謝謝!

回答

2

這可能發生,因爲parent_objNone創建ClassB當你不傳遞key_name。在這種情況下,您有多個實體組(每個沒有祖先的實體都是一個單獨的組)。

如果parent_obj爲None與否這會工作:

parent_obj = ClassA.all().get() 

def txn(): 
    key_name = 'hash of something here' 

    if not db.get(db.Key.from_path('ClassB', key_name, parent=parent_obj)): 
    obj = ClassB(
     key_name = key_name, 
     parent = parent_obj 
    ) 
    obj.put() 

db.run_in_transaction(txn) 
+0

非常感謝賴斯,我認爲你是對的。在我的情況下,parent_obj不是None,但我確信我所做的是正確的,我將代碼推送到了生產服務器上,而且看它工作正常。所以我重新啓動了GoogleAppEngine啓動器,它也開始在本地工作。不知道那是怎麼回事! – Mason 2011-05-11 09:04:18

+0

請注意,您的代碼中存在錯誤:您沒有使用給定的key_name創建實體。你正在檢查是否存在某種東西,如果不是你正在創造不同的東西。 – moraes 2011-05-11 09:27:08

+0

謝謝,在簡化問題發佈的過程中,這個錯誤悄然而至。 – Mason 2011-05-11 09:51:02