加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 如何使用alembic在after_create上发出自定义DDL?

发布时间:2020-12-13 16:15:51 所属栏目:百科 来源:网络整理
导读:我有几个我想在create table之后运行的自定义DDL语句: update_function = DDL(""" CREATE OR REPLACE FUNCTION update_timestamp()RETURNS TRIGGER AS $$BEGIN NEW.updated_at = now(); RETURN NEW;END;$$language 'pgplsql';""")update_trigger = DDL("""C
我有几个我想在create table之后运行的自定义DDL语句:
update_function = DDL("""                                                                                                                                                       
CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = now();
    RETURN NEW;
END;
$$language 'pgplsql';
""")

update_trigger = DDL("""
CREATE TRIGGER update %(table)s_timestamp BEFORE UPDATE
ON %(table)s FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
""")

而且我像这样附上了他们:

event.listen(Session.__table__,'after_create',update_function)
event.listen(Session.__table__,update_trigger)

当我做create_all时,我得到了我期望的SQL:

CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = now();
    RETURN NEW;
END;
$$language 'pgplsql';


CREATE TRIGGER update session_timestamp BEFORE UPDATE
ON session FOR EACH ROW EXECUTE PROCEDURE update_timestamp();

但是当我使用Alembic升级时,语句不会出现:

-- Running upgrade c0d470e5c81 -> 6692fad7378

CREATE TABLE session (
    created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT 'CURRENT_TIMESTAMP',updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT 'CURRENT_TIMESTAMP',id VARCHAR(32) NOT NULL,owner_id INTEGER,database_id VARCHAR(32),content TEXT,PRIMARY KEY (id),FOREIGN KEY(database_id) REFERENCES database (id),FOREIGN KEY(owner_id) REFERENCES users (id)
);

INSERT INTO alembic_version (version_num) VALUES ('6692fad7378');

有没有办法让alembic触发’after_create’事件?

发出表级别before_create / after_create事件(不是元数据级别的事件).您需要确保env.py脚本中发生的任何事情最终都涉及正在设置的事件侦听器.

你在这里的代码看起来有点怀疑:

event.listen(Session.__table__,update_trigger)

Session .__ table__这里只是一个Table实例,这可能不是你在alembic脚本中看到的. alembic create_table命令在本地创建一个表,并在其上运行一个创建,因此您需要全局监听所有Table对象:

from sqlalchemy import Table
event.listen(Table,update_function)
event.listen(Table,update_trigger)

如果这些事件仅适用于这一个特定的表,那么您将不会使用任何事件,您只需将这些触发器的DDL()直接放在迁移脚本中,就在它调用create_table()之后.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读