python - SQLAlchemy 唯一对象

标签 python mysql database sqlalchemy

假设我有以下类(class):

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

最佳答案

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

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

我不会担心的。我没有,我使用的随机值(大部分是 UUID4)发生碰撞的几率比你的高得多。 (但仍然很低。)

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

关于python - SQLAlchemy 唯一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067951/

相关文章:

database - 如何设计 SaaS 数据库

php - 用户 'admin' @'localhost' 的 MySQL 访问被拒绝(使用密码 : YES)

python - Scrapy并发策略

python - 在 Python 3.4 中使用 Kivy

sql - 使用 SQL 查找订单数量超过 X 的客户总数

mysql - 从未借过书的学生的子查询SQL

python - 在 Python 中实现线性回归

python - PyQt5:使用 QtDesigner,如何将信号与模块中定义的插槽/可调用对象连接起来

javascript - 如何编辑循环MySQL数据?

python - 如何在 PostgreSQL 数据库中存储 NumPy 数组?