2017-05-03 78 views
1

我有描述如下用户模型: -SQL的炼金完整性错误

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)]) 

现在的问题,

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

现在我在数据库中使用插入语句插入一个新的用户与一个有效的ID。所以我通过在数据库中插入语句创建了id2的user2。

如果我尝试创建通过web应用程序用户3,它显示sqlalchemy.exc.IntegrityError IntegrityError:(psycopg2.IntegrityError)重复键值违反唯一约束 “users_pkey” 详细信息:按键(ID)=(2 ) 已经存在。

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

我尝试使用自动加载,使烧瓶知道最近的ID,但它不工作。

+2

您可以将ID设置为明确增加,像这样:'ID = db.Column' – Cicero

+0

它不是由包括自动增量=真正的工作(db.Integer,primary_key = True时,自动增量= TRUE)。如果在出现错误后再次尝试,它正在递增。 –

+0

在添加'...,autoincrement = True'后,您是否将更改应用于数据库?这不会自动发生,您必须以某种方式迁移现有的数据库,即将您的整数主键列更改为序列。 –

回答

1

黑客将查询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() 
0

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

from sqlalchemy import Integer, Sequence 

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

数据库插入后得到相同的错误时,它工作正常。 –

+1

您是否重新创建了架构?确保序列已创建。 – ScR4tCh