2009-11-27 11 views
3

在某些數據庫技術中,對於記錄中的屬性,可以保證整個數據庫中該屬性的唯一性。一個例子可能是用戶記錄中的email_address屬性。通過將email_address設置爲唯一,可以保證特定的電子郵件地址只能出現在整個數據庫的一條記錄中。如何在Google應用引擎上的python中創建獨特的屬性?

在谷歌應用程序引擎中有沒有什麼方法可以爲給定模型提供獨特的屬性?作爲一個例子,我可以擁有一個用戶(db.Model)實體,其電子郵件屬性在整個數據存儲中保證是唯一的嗎?

我發現這個resource here,這可能會有幫助。

+0

這是這個問題的重複:http://stackoverflow.com/questions/1185628/how-do-i-define-a-unique-property-for-a-model-in-google-app-engine – 2012-05-28 20:50:28

回答

2

我已經通過重寫put方法和使用key.name

通過以下方式來實現它
class Program(db.Model): 
    name = db.StringProperty("Title") 
    slug = db.StringProperty("Slug") 
    def put(self): 
     if Program.get_by_key_name(self.slug): 
      raise UniqueConstraintViolation("slug", self.slug) 
     self._key_name = self.slug 
     return db.Model.put(self) 


class UniqueConstraintViolation(Exception): 
    def __init__(self, scope, value): 
     super(UniqueConstraintViolation, self).__init__("Value '%s' is not unique within scope '%s'." % (value, scope,)) 

我將slug保存爲key.name,如果您嘗試添加另一個程序,它將檢查密鑰名稱是否已存在。這可能不是一個好方法,即時通訊也是python/app引擎的初學者。

這是關於某人使用輔助模型很好的文章:http://squeeville.com/2009/01/30/add-a-unique-constraint-to-google-app-engine/

編輯:我看見你還提供了那篇文章笑。

4

從GAE的數據存儲獲得唯一有關「唯一性」的幫助是通過實體的鍵 - 但是,然後,我看到您引用的URL也注意到了這一點,並顯示了利用這一事實的一種方法。要獲得超出密鑰的任何位置,您需要在應用程序級別執行檢查(在您放置實體或更改唯一屬性集合之前,您可以進行適當的查詢[[僅限速度鍵]]並檢查它空出來),但是這會變得非常昂貴(並且很難使交易安全)。

相關問題