【问题标题】:SQLAlchemy Unique ObjectSQLAlchemy 唯一对象
【发布时间】:2012-06-17 00:04:39
【问题描述】:

假设我有以下课程:

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 本身,所以我不确定该怎么做。谢谢。

【问题讨论】:

    标签: python mysql database sqlalchemy


    【解决方案1】:

    意识到发生碰撞的可能性非常、非常、非常低。

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

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

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

    【讨论】:

    • 谢谢。那么 Python 的 random 库是否足够?我只是担心随机数生成器会产生冲突。有没有更好的库可以使用?
    • 我回答了我自己的问题。我生成了 10,000,000 个 64 字节的字符串,没有任何冲突,所以我很满意。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2021-03-03
    • 2021-12-02
    相关资源
    最近更新 更多