Alembic/Flask迁移在创建事件后未检测到
我有一个简单的Alchemy模型(使用事件侦听器创建触发器): 当我运行Alembic migrate and upgrade时,不会创建触发器(在MySQL中)。但是,当我使用db.create_all()时,它被创建并正常工作Alembic/Flask迁移在创建事件后未检测到,flask,sqlalchemy,flask-sqlalchemy,alembic,flask-migrate,Flask,Sqlalchemy,Flask Sqlalchemy,Alembic,Flask Migrate,我有一个简单的Alchemy模型(使用事件侦听器创建触发器): 当我运行Alembic migrate and upgrade时,不会创建触发器(在MySQL中)。但是,当我使用db.create_all()时,它被创建并正常工作 有没有可能让Alembic/Flask Migrate创建和管理我的触发器(即,在创建事件后运行的自定义DDL)?我也遇到过同样的问题,尝试了一个使用Replacable对象的解决方案,但没有成功: 我通过编辑迁移脚本并执行触发器创建查询,使其正常工作 以下是步骤:
有没有可能让Alembic/Flask Migrate创建和管理我的触发器(即,在创建事件后运行的自定义DDL)?我也遇到过同样的问题,尝试了一个使用Replacable对象的解决方案,但没有成功: 我通过编辑迁移脚本并执行触发器创建查询,使其正常工作 以下是步骤:
- 运行
它将在迁移文件夹的version子文件夹下为您生成迁移脚本flask db migrate-m'在表x上添加自定义触发器
- 检查在版本下创建的文件夹,并按如下方式编辑它:
def upgrade():
op.create_sp(delete_trigger)
def downgrade():
op.drop_sp(delete_trigger)
按如下方式创建触发器查询:
def upgrade():
op.create_sp(delete_trigger)
def downgrade():
op.drop_sp(delete_trigger)
在文件中:
trigger = '''
CREATE TRIGGER confirm_delete
BEFORE DELETE
ON confirm FOR EACH ROW
BEGIN
INSERT INTO confirm_old ( orig_created, orig_modified, orig_id )
VALUES ( OLD.created, OLD.modified, OLD.id );
END;
'''
在升级方法中:
添加此行:
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
# ### end Alembic commands ###
### add your queries here execute
op.execute(trigger)
如果运行flask db upgrade
,它将执行查询并更新数据库
要降级数据库,请在降级方法中添加以下内容:
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
# ### end Alembic commands ###
op.execute('drop trigger if exists confirm_delete on confirm cascade;')
如果您检查数据库,将应用更改
PS:更优雅的解决方案应该是建议的
对于可替换对象,尝试了它,但不起作用,可能是我的alembic未更新
以下是解决方案的外观:
创建可替换对象类:
class ReplaceableObject(object):
def __init__(self, name, sqltext):
self.name = name
self.sqltext = sqltext
用查询语句实例化它
delete_trigger = ReplaceableObject('delete_trigger', trigger)
按如下方式更新升级和降级功能:
def upgrade():
op.create_sp(delete_trigger)
def downgrade():
op.drop_sp(delete_trigger)
希望它能帮助其他人…不知道为什么在使用Alembic时触发器没有命中,但我可以告诉您,如果您正在使用迁移,最好将触发器创建包含在迁移脚本中,而不是包含在SQLAlchemy事件中。听起来不错-有没有办法跟踪活动DDL的当前状态?我的意思是跟踪迁移历史中的每一步(这是您建议的),以及触发器的当前活动状态(或任何DDL)?我不确定我是否理解这个问题。有了迁移脚本,您就有了一个定义良好的模式历史记录。请记住,迁移脚本具有升级和降级功能,这允许您跳转到数据库架构历史记录中的任何点。Alembic不会自动检测自定义DDL。您应该看一下文档中概述了如何简化触发器、函数和视图管理的部分。@univerio,该链接现在已失效,但此链接(当前)有效: