class TriggerMigrator: def __init__(self, bind, target): self.bind = bind self.target = target def upgrade(self): self.bind.execute( f""" CREATE OR REPLACE FUNCTION {self.target.function_name}() RETURNS TRIGGER LANGUAGE PLPGSQL AS $$ BEGIN IF (TG_OP = 'DELETE') THEN {self.target.on_delete()} RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN {self.target.on_update()} RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN {self.target.on_insert()} RETURN NEW; END IF; END $$; """ ) self.bind.execute( f""" CREATE TRIGGER {self.target.function_name}_trigger AFTER INSERT OR UPDATE OR DELETE ON "{self.target.table}" FOR EACH ROW EXECUTE PROCEDURE {self.target.function_name}(); """ ) def rollback(self): self.bind.execute( f""" DROP TRIGGER IF EXISTS {self.target.function_name}_trigger ON "{self.target.table}"; DROP FUNCTION IF EXISTS {self.target.function_name}(); """ )