From: RamonWill Date: Sun, 30 Aug 2020 12:54:51 +0000 (+0100) Subject: include trigger test for postgresql and correct documentatione example X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1db5e47adb90f9d51e247711dcfdbb274fb7bf73;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git include trigger test for postgresql and correct documentatione example --- diff --git a/doc/build/core/ddl.rst b/doc/build/core/ddl.rst index 30619a419a..9c2fed198d 100644 --- a/doc/build/core/ddl.rst +++ b/doc/build/core/ddl.rst @@ -59,9 +59,24 @@ the PostgreSQL backend, we could invoke this as:: Column('data', String(50)) ) + func = DDL( + "CREATE FUNCTION my_func() " + "RETURNS TRIGGER AS $$ " + "BEGIN " + "NEW.data := 'ins'; " + "RETURN NEW; " + "END; $$ LANGUAGE PLPGSQL" + ) + trigger = DDL( "CREATE TRIGGER dt_ins BEFORE INSERT ON mytable " - "FOR EACH ROW BEGIN SET NEW.data='ins'; END" + "FOR EACH ROW EXECUTE PROCEDURE my_func();" + ) + + event.listen( + mytable, + 'after_create', + func.execute_if(dialect='postgresql') ) event.listen( @@ -296,5 +311,3 @@ DDL Expression Constructs API .. autoclass:: DropSchema :members: :undoc-members: - - diff --git a/test/orm/test_defaults.py b/test/orm/test_defaults.py index 39f48bfccf..3c08b9b552 100644 --- a/test/orm/test_defaults.py +++ b/test/orm/test_defaults.py @@ -42,6 +42,9 @@ class TriggerDefaultsTest(fixtures.MappedTest): sa.schema.FetchedValue(for_update=True), ), ) + + is_postgresql = testing.db.dialect.name == "postgresql" + for ins in ( sa.DDL( "CREATE TRIGGER dt_ins AFTER INSERT ON dt " @@ -61,18 +64,39 @@ class TriggerDefaultsTest(fixtures.MappedTest): "BEGIN " ":NEW.col2 := 'ins'; :NEW.col4 := 'ins'; END;" ).execute_if(dialect="oracle"), + sa.DDL( + "CREATE TRIGGER dt_ins BEFORE INSERT " + "ON dt " + "FOR EACH ROW " + "EXECUTE PROCEDURE my_func_ins();" + ).execute_if(dialect="postgresql"), sa.DDL( "CREATE TRIGGER dt_ins BEFORE INSERT ON dt " "FOR EACH ROW BEGIN " "SET NEW.col2='ins'; SET NEW.col4='ins'; END" ).execute_if( callable_=lambda ddl, target, bind, **kw: bind.engine.name - not in ("oracle", "mssql", "sqlite") + not in ("oracle", "mssql", "sqlite", "postgresql") ), ): - event.listen(dt, "after_create", ins) + if ins.dialect == "postgresql": + my_func_ins = sa.DDL( + "CREATE OR REPLACE FUNCTION my_func_ins() " + "RETURNS TRIGGER AS $$ " + "BEGIN " + "NEW.col2 := 'ins'; NEW.col4 := 'ins'; " + "RETURN NEW; " + "END; $$ LANGUAGE PLPGSQL" + ).execute_if(dialect="postgresql") + event.listen(dt, "after_create", my_func_ins) - event.listen(dt, "before_drop", sa.DDL("DROP TRIGGER dt_ins")) + event.listen(dt, "after_create", ins) + if is_postgresql: + event.listen( + dt, "before_drop", sa.DDL("DROP TRIGGER dt_ins ON dt") + ) + else: + event.listen(dt, "before_drop", sa.DDL("DROP TRIGGER dt_ins")) for up in ( sa.DDL( @@ -91,18 +115,37 @@ class TriggerDefaultsTest(fixtures.MappedTest): "FOR EACH ROW BEGIN " ":NEW.col3 := 'up'; :NEW.col4 := 'up'; END;" ).execute_if(dialect="oracle"), + sa.DDL( + "CREATE TRIGGER dt_up BEFORE UPDATE ON dt " + "FOR EACH ROW " + "EXECUTE PROCEDURE my_func_up();" + ).execute_if(dialect="postgresql"), sa.DDL( "CREATE TRIGGER dt_up BEFORE UPDATE ON dt " "FOR EACH ROW BEGIN " "SET NEW.col3='up'; SET NEW.col4='up'; END" ).execute_if( callable_=lambda ddl, target, bind, **kw: bind.engine.name - not in ("oracle", "mssql", "sqlite") + not in ("oracle", "mssql", "sqlite", "postgresql") ), ): + if up.dialect == "postgresql": + my_func_up = sa.DDL( + "CREATE OR REPLACE FUNCTION my_func_up() " + "RETURNS TRIGGER AS $$ " + "BEGIN " + "NEW.col3 := 'up'; NEW.col4 := 'up'; " + "RETURN NEW; " + "END; $$ LANGUAGE PLPGSQL" + ).execute_if(dialect="postgresql") + event.listen(dt, "after_create", my_func_up) + event.listen(dt, "after_create", up) - event.listen(dt, "before_drop", sa.DDL("DROP TRIGGER dt_up")) + if is_postgresql: + event.listen(dt, "before_drop", sa.DDL("DROP TRIGGER dt_up ON dt")) + else: + event.listen(dt, "before_drop", sa.DDL("DROP TRIGGER dt_up")) @classmethod def setup_classes(cls): diff --git a/test/requirements.py b/test/requirements.py index 6d4b3dc90c..1c2561bbbe 100644 --- a/test/requirements.py +++ b/test/requirements.py @@ -436,11 +436,6 @@ class DefaultRequirements(SuiteRequirements): no_support("mysql", "requires SUPER priv"), no_support("mariadb", "requires SUPER priv"), exclude("mysql", "<", (5, 0, 10), "not supported by database"), - # huh? TODO: implement triggers for PG tests, remove this - no_support( - "postgresql", - "PG triggers need to be implemented for tests", - ), ] )