我有几个我想在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()之后.