SQLAlchemy在创建

时间:2016-05-03 12:14:28

标签: python flask sqlalchemy flask-login

我有这个方法来创建随机用户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))
    # ...

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

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

此错误至少发生在一半时间。

1 个答案:

答案 0 :(得分:3)

问题是您在模型定义中调用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))
    # ...