Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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 如何使用alembic控制函数和触发器的版本?_Python_Sql_Postgresql_Triggers_Alembic - Fatal编程技术网

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抽象对于一个简单触发器来说过于复杂的原因