2015-05-19 76 views
1

我試圖爲我的「頁面」網頁生成一個唯一的名稱空間(「7FH98T」)。起初我正在考慮生成一個名稱空間,然後查詢數據庫以檢查名稱空間不存在,但我想如果有500,000個頁面,那麼每次創建新頁面時查詢所有名稱空間效率都不高。檢查url命名空間是否唯一的最佳方法是什麼?

我知道我可以運行db.session.commit(),如果有一個異常只是回滾並生成一個新的名稱空間,但我寧願處理generate_namespace()函數內的檢查唯一性。

這是我的代碼。我希望我解釋清楚我正在努力做什麼。提前致謝。

class Page(db.Model): 
    __tablename__ = 'pages' 
    id = db.Column(db.Integer, primary_key=True) 
    namespace = db.Column(db.String(6), unique=True) 

    @staticmethod 
    def generate_namespace(): 
     import random 
     import string 

     while unique == False: 
      namespace = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(6)) 
      p = Page.query.filter_by(namespace=namespace).first() 
      if not p: # Is this really the best way to do this? 
       continue 
      else: 
       unique = True 

     return namespace 
+1

至少根據您在代碼中的評論,這是做到這一點的最佳方式。 – nathancahill

+1

只要重複查詢(儘管每頁不止一次查詢的機會是天文數字),請在命名空間列上創建一個「哈希」或「btree」索引。 – nathancahill

回答

1

If you need a unique identifier then one solution is to generate a UUID

import uuid 

class Page(db.Model): 
    __tablename__ = 'pages' 
    id = db.Column(db.Integer, primary_key=True) 
    namespace = db.Column(db.String(6), unique=True) 

    @staticmethod 
    def generate_namespace(): 
     namespace = uuid.uuid4() # Will produce a unique to the world identifier. 
     return namespace 

另外,我強烈建議你保持進口量爲您的模塊的頂部。進口需要很長時間。

相關問題