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

意识到碰撞的机会非常、非常、非常低。

假设您的随机字符串仅由大写字母和数字组成。每个字符有 36 种可能性。您的公钥的 16 个字符将为您提供 36^16 个组合。大约是 8,后面有 24 个 0。即使您的数据库中有一百万个键,当您添加一个新键时发生冲突的几率也是 10^-19。

我不会担心的。我没有,而且我使用的随机值(大多数情况下是 UUID4)发生碰撞的可能性比你的要高得多。(但仍然很低。)

如果您仍然担心:SQLAlchemy 可能不会强制执行UNIQUE,但您的 DBMS 应该执行,这意味着如果违反 UNIQUE 约束,SQLAlchemy 将抛出异常。可以捕获异常并优雅地降级。

于 2012-06-17T00:19:20.923 回答