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()之后. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |