Python 如何使用alembic控制函数和触发器的版本?
假设数据库中有一个触发器,它有一个函数,如下所示:Python 如何使用alembic控制函数和触发器的版本?,python,sql,postgresql,triggers,alembic,Python,Sql,Postgresql,Triggers,Alembic,假设数据库中有一个触发器,它有一个函数,如下所示: from alembic import op create_trigger = """...SQL...""" drop_trigger = """...SQL...""" def upgrade(): op.execute(create_trigger) def downgrade(): op.exe
from alembic import op
create_trigger = """...SQL..."""
drop_trigger = """...SQL..."""
def upgrade():
op.execute(create_trigger)
def downgrade():
op.execute(drop_trigger)
--在另一个表中插入新条目
--每次插入新行时
CREATE函数trgfunc_write_log()将触发器返回为$$
开始
插入到其他表格中(
--一些专栏
仪表id,
拍摄日期:,
温度,
)价值观(
新的米_id,
新的。花了多少时间,
新温度
);
归还新的;
结束;
$$语言“plpgsql”;
--触发器本身:插入后
创建触发训练温度读数
插入温度读数后
每行
执行函数trgfunc_write_log();
通常,此触发器将位于我的SqlAlchemy模型旁边,并使用以下内容自动创建:
from alembic import op
create_trigger = """...SQL..."""
drop_trigger = """...SQL..."""
def upgrade():
op.execute(create_trigger)
def downgrade():
op.execute(drop_trigger)
从sqlalchemy导入DDL,事件
从sqlalchemy.ext.declarative导入声明性基础
Base=声明性_Base()
课堂阅读(基础):
...
创建_trigger=DDL(“…SQL…”)
事件.listen(读取.\uuuuu表\uuuuu,'after\u create',create\u触发器)
对于Alembic迁移,您在版本控制这样一个触发器及其功能方面的最佳做法是什么?我最近在一个应用程序中遇到了同样的问题,并在Alembic Cookbook中找到了这个问题 它概述了创建一个对象的有点复杂的策略,该对象封装了用于创建视图、存储过程或触发器的名称和SQL,以及用于执行Alembic操作以升级和降级该schema对象的其他对象。在Alembic修订版中使用时,它看起来像这样:
from alembic import op
from my_module import ReplaceableObject
my_trigger = ReplaceableObject(
"trigger_name",
"""...SQL..."""
)
def upgrade():
op.create_trigger(my_trigger)
def downgrade():
op.drop_trigger(my_trigger)
我的团队目前正在讨论,与视图或存储过程相比,这个策略对于简单的触发器来说是否过于复杂。您可能会更频繁地更新这些模式对象,从而使Cookbook抽象中概述的许多行为比使用简单触发器更有价值
另一个提议的方案是这样的:
from alembic import op
create_trigger = """...SQL..."""
drop_trigger = """...SQL..."""
def upgrade():
op.execute(create_trigger)
def downgrade():
op.execute(drop_trigger)
这两个实现看起来几乎相同,这就是Cookbook抽象对于一个简单触发器来说过于复杂的原因