Skip to content

Commit f2d6a87

Browse files
authored
Merge pull request #112 from DanCardin/dc/trigger-quoting
fix: Trigger quoting (with schemas).
2 parents 0263df6 + ab6fc5e commit f2d6a87

File tree

5 files changed

+86
-4
lines changed

5 files changed

+86
-4
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
## 0.15
44

5+
### 0.15.10
6+
7+
- feat: Support alembic check.
8+
- fix: Quote trigger name/tablenames.
9+
510
### 0.15.9
611

712
- fix: Quote trigger name/tablenames.

pyproject.toml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
[project]
22
name = "sqlalchemy-declarative-extensions"
3-
version = "0.15.9"
3+
version = "0.15.10"
44
authors = [
55
{name = "Dan Cardin", email = "[email protected]"},
66
]
77
description = "Library to declare additional kinds of objects not natively supported by SQLAlchemy/Alembic."
88
license = {file = "LICENSE"}
9-
repository = "https://github.com/dancardin/sqlalchemy-declarative-extensions"
109
readme = 'README.md'
1110

1211
keywords = [
@@ -36,6 +35,12 @@ dependencies = [
3635
"sqlalchemy >= 1.3",
3736
]
3837

38+
[project.urls]
39+
documentation = "https://sqlalchemy-declarative-extensions.readthedocs.io/en/latest/"
40+
homepage = "https://sqlalchemy-declarative-extensions.readthedocs.io/en/latest/"
41+
repository = "https://github.com/dancardin/sqlalchemy-declarative-extensions"
42+
changelog = "https://github.com/DanCardin/sqlalchemy-declarative-extensions/blob/main/CHANGELOG.md"
43+
3944
[project.optional-dependencies]
4045
alembic = ["alembic >= 1.0"]
4146
parse = ["sqlglot"]

src/sqlalchemy_declarative_extensions/dialects/postgresql/trigger.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,11 @@ def to_sql_create(self, replace=False):
159159
components.append(self.time.value)
160160
components.append(" OR ".join([e.value for e in self.events]))
161161
components.append("ON")
162-
components.append(f'"{self.on}"')
162+
163+
on_components = [f'"{component}"' for component in self.on.split(".")]
164+
on = ".".join(on_components)
165+
components.append(on)
166+
163167
components.append("FOR EACH")
164168
components.append(self.for_each.value)
165169

tests/trigger/test_schema_quoting.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from pytest_mock_resources import create_postgres_fixture
2+
from sqlalchemy import Column, types
3+
4+
from sqlalchemy_declarative_extensions import (
5+
Function,
6+
Functions,
7+
Triggers,
8+
declarative_database,
9+
register_sqlalchemy_events,
10+
)
11+
from sqlalchemy_declarative_extensions.dialects.postgresql import Trigger
12+
from sqlalchemy_declarative_extensions.sqlalchemy import declarative_base
13+
from sqlalchemy_declarative_extensions.trigger.compare import compare_triggers
14+
15+
_Base = declarative_base()
16+
17+
18+
@declarative_database
19+
class Base(_Base): # type: ignore
20+
__abstract__ = True
21+
22+
schemas = ["table"]
23+
functions = Functions().are(
24+
Function(
25+
"gimme",
26+
"""
27+
BEGIN
28+
INSERT INTO "table"."select" (id) select NEW.id + 1;
29+
RETURN NULL;
30+
END
31+
""",
32+
language="plpgsql",
33+
returns="trigger",
34+
)
35+
)
36+
triggers = Triggers().are(
37+
Trigger.after("insert", on="table.select", execute="gimme")
38+
.named("on_insert_foo")
39+
.when("pg_trigger_depth() < 1")
40+
.for_each_row(),
41+
)
42+
43+
44+
class Foo(Base):
45+
__tablename__ = "select"
46+
__table_args__ = {"schema": "table"}
47+
48+
id = Column(types.Integer(), primary_key=True)
49+
50+
51+
register_sqlalchemy_events(Base.metadata, functions=True, triggers=True, schemas=True)
52+
53+
pg = create_postgres_fixture(engine_kwargs={"echo": True}, session=True)
54+
55+
56+
def test_quotes_target_components(pg):
57+
Base.metadata.create_all(bind=pg.connection())
58+
pg.commit()
59+
60+
pg.add(Foo(id=5))
61+
pg.commit()
62+
63+
result = [r.id for r in pg.query(Foo).all()]
64+
assert result == [5, 6]
65+
66+
connection = pg.connection()
67+
diff = compare_triggers(connection, Base.metadata.info["triggers"])
68+
assert diff == []

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)