2

次のクラスがあるとします。

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_keyランダムprivate_keyな文字列である必要があります(これは問題ではありません)が、それを確認する最善の方法がわかりません

  1. 文字列は他のどこにも存在しません
  2. それらの存在を確認してからオブジェクトを作成するまでの間、それらは別のプロセスによってまだ作成されていません。

私はこれに出くわした最初の人ではないことを知っていますが、これについて多くを見つけることができませんでした. SQLAlchemy は実際にはuniqueそれ自体を強制していないように見えるので、どうすればよいかわかりません。ありがとう。

4

1 に答える 1

1

衝突の可能性は非常に、非常に、非常に低いことを認識してください。

ランダムな文字列が大文字と数字のみで構成されているとしましょう。これは、1 キャラクターあたり 36 の可能性です。公開鍵の 16 文字は、36^16 の組み合わせになります。これは約 8 で、その後に 24 個の 0 が続きます。データベースに 100 万個のキーがある場合でも、新しいキーを追加したときに衝突する可能性は 10^-19 です。

私はそれについて心配しません。私が使用するランダムな値 (ほとんどの場合、UUID4) は、あなたのものよりも衝突の可能性がはるかに高くなります。(しかし、それでも天文学的に低い。)

それでも心配な場合: SQLAlchemy は を強制しない可能性がありUNIQUEますが、DBMS は強制する必要があります。つまり、UNIQUE 制約に違反した場合、SQLAlchemy は例外をスローします。例外をキャッチし、正常に機能を低下させることができます。

于 2012-06-17T00:19:20.923 に答える