Python 尝试使用Flask SqlAlchemy event.listen更改我的表中的自动增量开始值,但我遇到了表不';不存在
型号.pyPython 尝试使用Flask SqlAlchemy event.listen更改我的表中的自动增量开始值,但我遇到了表不';不存在,python,mysql,sqlalchemy,flask-sqlalchemy,flask-migrate,Python,Mysql,Sqlalchemy,Flask Sqlalchemy,Flask Migrate,型号.py #imports class User(db.Model): __tablename__ = 'userstore' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True) password = db.Column(db.String(128)) role = db.Column(db.String(15))
#imports
class User(db.Model):
__tablename__ = 'userstore'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True)
password = db.Column(db.String(128))
role = db.Column(db.String(15))
created_on = db.Column(db.TIMESTAMP, default=datetime.now())
logged_in = db.Column(db.TIMESTAMP, nullable=True)
def set_password(self, password):
self.password = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password, password)
#Here i am trying to change autoincment vaue
event.listen(User.__table__,"after_create",db.engine.execute(""" ALTER TABLE userstore AUTO_INCREMENT = 100000001""")
)
还尝试使用类似DDL的
使用DDL时,迁移运行时没有任何错误,但id值仍然从1开始,这意味着上面event.listen中的DDL查询不会以某种方式执行
app.py
执行后出错
flask db init
这个问题是:
event.listen(User.__table__,"after_create",db.engine.execute(""" ALTER TABLE userstore AUTO_INCREMENT = 100000001"""))
这意味着db.engine.execute()
调用将立即运行,而不是在事件触发时运行
我相信正确的版本是您的第二个版本,它将导致SQL语句在创建表时运行
event.listen(User.__table__,"after_create", DDL(""" ALTER TABLE userstore AUTO_INCREMENT =100000001"""))
运行
flask db init
不会导致创建任何表。您需要使用flask db migrate
创建迁移,然后使用flask db upgrade
执行迁移。只有在该点上,事件才会触发。此事件的问题:
event.listen(User.__table__,"after_create",db.engine.execute(""" ALTER TABLE userstore AUTO_INCREMENT = 100000001"""))
这意味着db.engine.execute()
调用将立即运行,而不是在事件触发时运行
我相信正确的版本是您的第二个版本,它将导致SQL语句在创建表时运行
event.listen(User.__table__,"after_create", DDL(""" ALTER TABLE userstore AUTO_INCREMENT =100000001"""))
运行
flask db init
不会导致创建任何表。您需要使用flask db migrate
创建迁移,然后使用flask db upgrade
执行迁移。只有在这一点上事件才会触发。我不熟悉Flask或SQLAlchemy,但错误表明table userstore不存在。当Alter Table针对它运行时,您确定它确实存在吗?不,它们最初不存在,这就是为什么在使用FLASH迁移命令创建表时,我使用事件侦听器的“after_create”来调用DDL。我不熟悉FLASH或SQLAlchemy,但错误表明Table userstore不存在。当Alter Table针对它运行时,您确定它确实存在吗?不,它们最初不存在这就是为什么我在使用flask迁移命令创建表时使用事件侦听器的“after_create”来调用DDL的原因。感谢您的帮助,环顾四周后,我意识到第二个包含DDL的是正确的,只有在显式执行模型文件中缺少的db.create\u all()
时才会调用该事件。如果使用Flask Migrate,则不会调用db.create\u all()
。相反,您应该创建一个迁移脚本(flask db migrate
),然后运行它(flask db upgrade
),正如我在回答中提到的那样。Flask Migrate与db.create_all()竞争,您必须选择要使用的方法来维护数据库架构。感谢您的帮助,在仔细查看之后,我意识到第二个包含DDL的方法是正确的,并且只有在显式执行db.create_all()时才会调用该事件
我的模型文件中缺少它。如果您使用的是Flask Migrate,则不会调用db.create\u all()
。相反,您应该创建一个迁移脚本(flask db migrate
),然后运行它(flask db upgrade
),正如我在回答中提到的那样。Flask Migrate与db.create_all()竞争,您必须选择要使用哪种方法来维护数据库架构。
event.listen(User.__table__,"after_create", DDL(""" ALTER TABLE userstore AUTO_INCREMENT =100000001"""))