2012-06-17 142 views
2

說我有下面的類:SQLAlchemy的唯一對象

class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    public_key = Column(String(16), nullable=False, unique=True) 
    private_key = Column(String(64), nullable=False, unique=True) 

我需要有兩個public_keyprivate_key是隨機的字符串(這是不是一個問題),但我不知道,以確保最好的辦法這

  1. 字符串不存在其他
  2. 隨時隨地檢查他們的存在,並創建對象之間,它們尚未被另一個進程創建。

我知道我不能成爲第一個遇到過這個問題的人,但我一直沒能找到太多的東西。看來,SQLAlchemy本身並不實際執行unique,所以我不知道該怎麼做。謝謝。

回答

1

認識到碰撞的機率非常非常非常低。

假設您的隨機字符串僅由大寫字母和數字組成。每個角色有36種可能性。您的公鑰的16個字符將爲您提供36^16個組合。大約在8點後24點鐘。即使數據庫中有一百萬個密鑰,添加新密鑰時發生衝突的可能性也是10^-19。

我不會擔心它。我沒有,而且我使用的隨機值(UUID4,大部分)碰撞的可能性要比你的高得多。 (但仍然天文數字低)

如果您仍然擔心:SQLAlchemy可能不強制UNIQUE,但您的DBMS應該,這意味着如果UNIQUE約束被違反,SQLAlchemy將引發異常。可以捕捉到異常並優雅地降級。

+0

謝謝。那麼Python的[random](http://docs.python.org/library/random.html)庫是否足夠?我只是擔心隨機數發生器會產生衝突。有更好的圖書館使用嗎? – Mark

+1

我回答了我自己的問題。我生成了10,000,000個64字節的字符串,沒有任何衝突,所以我非常滿意。謝謝。 – Mark