2012-07-08 110 views
2

我想在我的gae中擁有獨特的價值,所以我通過文檔閱讀並發現「交易」是原子的。GAE - 祖先問題

https://developers.google.com/appengine/docs/python/ndb/transactions

class Account(ndb.Model): 
    """"Required DB """ 
    username = ndb.StringProperty(required=True) 
    password = ndb.StringProperty(required=True) 
    mail = ndb.StringProperty(required=True) 
    salt = ndb.StringProperty(required=True) 
    date = ndb.DateTimeProperty(auto_now_add=True) 

    name = ndb.StringProperty() 
    last_name = ndb.StringProperty() 
    phone_number = ndb.IntegerProperty() 
    postal = ndb.IntegerProperty() 
    city = ndb.StringProperty() 

    products = ndb.IntegerProperty(repeated=True) 

    @ndb.transactional 
    def create_account(self): 
     acc = Account.query(Account.username==self.username) 
     acc = tuple(acc) 
     if len(acc)== 0: 
      self.put() 
     else: 
      #yield error 
      pass 

我awalys得到同樣的錯誤

BadRequestError:

Only ancestor queries are allowed inside transactions.

我的數據庫模型 「帳戶」 沒有任何祖先。 它不應該是唯一的「祖先」嗎?

+0

您在事務中進行查詢。你的查詢沒有'ancestor'。錯誤似乎是一致的 – 2012-07-08 20:03:17

+0

所以我不允許在事務內進行查詢?然後,我認爲我知道的唯一方法是將內容放在內存緩存中(我認爲內存緩存也應該是原子的) – 2012-07-09 10:31:42

+0

我沒有足夠的知識來充分響應您的問題,但是我的計算屬性存在相同的問題( s):這會進行查詢並返回一個簡單的總和。我不得不刪除所有交易 並直接投入繼續發展。在你的情況下嘗試沒有裝飾者..我們將有更好的答案 – 2012-07-09 12:30:32

回答

1

解決此問題的一種方法是使用用戶名作爲密鑰。

@classmethod 
@ndb.transactional 
def create(cls, username): 
    key = ndb.Key('Account', username) 
    existing_user = key.get() 
    if existing_user: 
     raise ValueError 
    else: 
     new_instance = cls(key=key, username=username) 
     new_instance.put() 
    return new_instance 
+0

謝謝。但你能向我解釋一個關鍵是什麼嗎?鍵和查詢有什麼區別?我閱讀https://developers.google.com/appengine/docs/python/ndb/entities,但我仍然困惑 – 2012-07-19 15:51:41

+0

請參閱https://developers.google.com/appengine/docs/python/ndb/keyclass,它是實體的數據庫密鑰。 – Chris 2013-01-01 18:54:28