Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sql炼金术完整性错误_Python_Sqlalchemy - Fatal编程技术网

Python Sql炼金术完整性错误

Python Sql炼金术完整性错误,python,sqlalchemy,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(d

我有如下描述的用户模型:-

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)])
现在我有一份登记表,如下所述:-

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

如果我尝试通过web app创建user3,它会显示sqlalchemy.exc.IntegrityError IntegrityError:(psycopg2.IntegrityError)重复的键值违反了唯一约束“users\u pkey” 详细信息:密钥(id)=(2)已存在。

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


我尝试使用autoload让flask知道最近的id,但它不起作用。

一种方法是从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()

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

from sqlalchemy import Integer, Sequence

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

您可以将id设置为显式递增,如下所示:
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
通过包含autoincrement=True,它不起作用。如果我在出现错误后重试,它将递增。在添加
…,autoincrement=True
后,是否将更改应用于数据库?这不是自动发生的,您必须以某种方式迁移现有的DBs,即将整型主键列更改为串行。@IljaEverilä我认为需要使用sql migrate和alembic来完成此操作,或者重新启动flask服务器就可以了,或者我应该删除整个表吗?我没有sql migrate的经验,但是alembic很适合处理项目迁移。如果您刚刚开始,并且没有太多数据,那么删除并重新创建是一种简单的方法。您重新创建了架构吗?确保序列已创建。