Sql-alchemy完整性错误

时间:2017-05-03 11:16:14

标签: python sqlalchemy

我有用户模型,如下所述: -

class User(db.Model, object):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(15), unique=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(80))

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def get_id(self):
        return unicode(self.id)

现在我有一份注册表格,如下所述: -

class RegisterForm(Form):
    email = StringField('email', validators=[InputRequired(), Email(message='Invalid email'), Length(max=50)])
    username = StringField('username', validators=[InputRequired(), Length(min=4, max=15)])
    password = PasswordField('password', validators=[InputRequired(), Length(min=8, max=80)])

现在出现问题,

当我通过web-app注册/注册时,id会自动递增并创建一个新用户。所以我创建了user1,id1由sql-alchemy通过注册表单自动分配。

现在我在数据库中使用insert语句来插入具有有效id的新用户。所以我通过数据库中的insert语句创建了带有id2的user2。

如果我尝试通过网络应用创建user3,则会显示 sqlalchemy.exc.IntegrityError IntegrityError:(psycopg2.IntegrityError)重复键值违反了唯一约束" users_pkey" DETAIL:Key(id)=(2)已经存在。

现在,如果我尝试使用user3注册,它会再创建一个新用户。

我尝试使用自动加载功能让烧瓶知道最近的ID,但它无效。

2 个答案:

答案 0 :(得分:1)

hack将从id列中查询最大id并将其递增1并将其分配给新用户以防止主键冲突。

max_id = session.query(User).order_by(User.id.desc()).first()
new_user = User(id=max_id+1, email=form.email.data, username=form.username.data, password=hashed_password)
db.session.add(new_user)
db.session.commit()

答案 1 :(得分:0)

只需使用序列自动增加您的ID。

from sqlalchemy import Integer, Sequence

id = Column(Integer, Sequence('id_seq'), primary_key=True)