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

前端之家收集整理的这篇文章主要介绍了postgresql – 如何使用alembic在after_create上发出自定义DDL?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有几个我想在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()之后.

猜你在找的Postgre SQL相关文章