Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.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 尝试使用Flask SqlAlchemy event.listen更改我的表中的自动增量开始值,但我遇到了表不';不存在_Python_Mysql_Sqlalchemy_Flask Sqlalchemy_Flask Migrate - Fatal编程技术网

Python 尝试使用Flask SqlAlchemy event.listen更改我的表中的自动增量开始值,但我遇到了表不';不存在

Python 尝试使用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))

型号.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))
    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"""))