【发布时间】:2016-07-27 02:52:43
【问题描述】:
我有一个简单的 Flask-SQLAlchemy 模型(带有事件监听器来创建触发器):
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Confirm(db.Model):
created = db.Column(db.DateTime, default=db.func.current_timestamp(), nullable=False)
modified = db.Column(db.DateTime, default=db.func.current_timestamp(), onupdate=db.func.current_timestamp(), nullable=False)
id = db.Column(db.String(36), primary_key=True)
class ConfirmOld(db.Model):
orig_created = db.Column(db.DateTime)
orig_modified = db.Column(db.DateTime)
orig_id = db.Column(db.String(36))
confirm_delete = DDL('''\
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;
''')
event.listen(Confirm.__table__, 'after_create', confirm_delete)
当我运行 Alembic 迁移和升级时,不会创建 TRIGGER(在 MySQL 中)。但是,当我使用 db.create_all() 时,它是创建并正常工作的。
是否可以让 Alembic / Flask-Migrate 创建和管理我的触发器(即在 after_create 事件上运行的自定义 DDL)?
【问题讨论】:
-
不确定为什么当您通过 Alembic 时触发器没有触发,但我可以告诉您,如果您正在使用迁移,最好将触发器创建包含在迁移脚本中,而不是在 SQLAlchemy 事件中。
-
听起来不错 - 有没有办法跟踪活动 DDL 的当前状态?我的意思是跟踪迁移历史中的每个步骤(这是您建议的)以及触发器的当前活动状态(或任何 DDL)?
-
不确定我是否理解这个问题。事实上,有了迁移脚本,您就有了非常明确的模式历史记录。回想一下,迁移脚本具有升级和降级功能,这允许您跳转到数据库架构历史中的任何点。
-
Alembic 不会自动检测自定义 DDL。您应该查看文档的 Replaceable Objects 部分,该部分概述了如何更轻松地管理触发器、函数和视图。
-
@univerio,该链接现已失效,但此链接(当前)有效:Replacable Objects
标签: flask sqlalchemy flask-sqlalchemy alembic flask-migrate