首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用alembic对函数和触发器进行版本控制?

如何使用alembic对函数和触发器进行版本控制?
EN

Stack Overflow用户
提问于 2021-04-25 04:46:42
回答 1查看 106关注 0票数 1

假设数据库中有一些带有函数的触发器,如下所示:

代码语言:javascript
运行
复制
-- Insert a new entry into another table
-- every time a NEW row is inserted
CREATE FUNCTION trgfunc_write_log() RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO some_other_table (
        -- some columns
        meter_id,
        date_taken,
        temperature,
    ) values (
        NEW.meter_id,
        NEW.time_taken,
        NEW.temperature
    );

    return NEW;
END;
$$ language 'plpgsql';

-- The trigger itself: AFTER INSERT
CREATE TRIGGER trg_temperature_readings
AFTER INSERT ON temperature_readings
FOR EACH ROW
EXECUTE FUNCTION trgfunc_write_log();

通常,此触发器将位于我的SqlAlchemy模型旁边,并自动创建,如下所示:

代码语言:javascript
运行
复制
from sqlalchemy import DDL, event
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Reading(Base):
   ...

create_trigger = DDL(""" ...SQL... """)
event.listen(Reading.__table__, 'after_create', create_trigger)

您在Alembic迁移中版本控制触发器及其功能的最佳实践是什么?

EN

Stack Overflow用户

发布于 2021-05-28 07:54:38

我最近在一个应用程序中遇到了同样的问题,并在Alembic Cookbook中找到了this article

它概述了一种比较复杂的创建对象的策略,该对象封装了用于创建视图、存储过程或触发器的名称和SQL,以及用于执行Alembic操作以升级和降级该模式对象的其他对象。当在Alembic版本中使用时,它看起来像这样:

代码语言:javascript
运行
复制
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抽象中概述的许多行为比使用简单触发器更有价值。

另一个建议的选项是这样的:

代码语言:javascript
运行
复制
from alembic import op


create_trigger = """...SQL..."""
drop_trigger = """...SQL..."""

def upgrade():
    op.execute(create_trigger)

def downgrade():
    op.execute(drop_trigger)

这两个实现看起来几乎相同,这是Cookbook抽象对于一个简单的触发器来说是不必要的复杂的论点。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67247268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档