Alembic/Flask迁移在创建事件后未检测到

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对象的解决方案,但没有成功: 我通过编辑迁移脚本并执行触发器创建查询,使其正常工作 以下是步骤:

我有一个简单的Alchemy模型(使用事件侦听器创建触发器):

当我运行Alembic migrate and upgrade时,不会创建触发器(在MySQL中)。但是,当我使用db.create_all()时,它被创建并正常工作


有没有可能让Alembic/Flask Migrate创建和管理我的触发器(即,在创建事件后运行的自定义DDL)?

我也遇到过同样的问题,尝试了一个使用Replacable对象的解决方案,但没有成功:

我通过编辑迁移脚本并执行触发器创建查询,使其正常工作

以下是步骤:

  • 运行
    flask db migrate-m'在表x上添加自定义触发器
    它将在迁移文件夹的version子文件夹下为您生成迁移脚本

  • 检查在版本下创建的文件夹,并按如下方式编辑它:

  • 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,该链接现在已失效,但此链接(当前)有效: