【问题标题】:SQLAlchemy pushes the same default id on creationSQLAlchemy 在创建时推送相同的默认 id
【发布时间】:2016-08-28 11:34:49
【问题描述】:

我有这个方法来创建一个随机用户ID:

import random
import string

def generate_id():
    size = 9
    chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
    return ''.join(random.SystemRandom().choice(chars) for _ in range(size))

还有这个用户的 SQLAlchemy 对象:

class User(db.Model, UserMixin):
    __tablename__ = 'user'
    id = db.Column(db.String, primary_key=True, default=generate_id())
    name = db.Column(db.String(255))
    # ...

我的问题是:有时它运行良好(有些人设法注册并创建一个新用户没有任何问题),有时为user.id 生成的default 已被使用,触发此错误:

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: user.id

这个错误至少有一半发生。

【问题讨论】:

    标签: python flask sqlalchemy flask-login


    【解决方案1】:

    问题是您在模型定义中调用了generate_id 函数。这意味着只有在您的应用程序第一次启动时才会生成一个值(每个线程/服务器一次)。

    由于 SQLAlchemy 接受可调用的默认值,您可以简单地删除 (),以便它自动在内部被调用:

    class User(db.Model, UserMixin):
        __tablename__ = 'user'
        id = db.Column(db.String, primary_key=True, default=generate_id)
        name = db.Column(db.String(255))
        # ...
    

    【讨论】:

    • 是的!很有意义。不知道可调用的默认值!你让我开心:)
    猜你喜欢
    • 2011-02-23
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2015-08-13
    • 2012-11-02
    相关资源
    最近更新 更多