Skip to content

Commit b2a5255

Browse files
committed
Fixed schema prefix in sequence reference messing server defaults
Fixes #176.
1 parent 9d9fafd commit b2a5255

File tree

3 files changed

+46
-4
lines changed

3 files changed

+46
-4
lines changed

CHANGES.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Version history
77
- Fixed unwarranted ``ForeignKey`` declarations appearing in column attributes when there are
88
named, single column foreign key constraints (PR by Leonardus Chen)
99
. Fixed ``KeyError`` when rendering an index without any columns
10+
- Fixed improper handling of schema prefixes in sequence names in server defaults
1011
- Worked around PostgreSQL UUID columns getting ``Any`` as the type annotation
1112

1213
**3.0.0b3**

src/sqlacodegen/generators.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@
7171
_re_enum_check_constraint = re.compile(r"(?:.*?\.)?(.*?) IN \((.+)\)")
7272
_re_enum_item = re.compile(r"'(.*?)(?<!\\)'")
7373
_re_invalid_identifier = re.compile(r"(?u)\W")
74-
_re_postgresql_nextval_sequence = re.compile(r"nextval\('(.+)'::regclass\)")
74+
_re_postgresql_nextval_sequence = re.compile(
75+
r"nextval\('(?:\"(.+?)\"\.)?(.+)'::regclass\)"
76+
)
7577

7678

7779
class CodeGenerator(metaclass=ABCMeta):
@@ -405,9 +407,17 @@ def render_column(self, column: Column[Any], show_name: bool) -> str:
405407
)
406408
if match:
407409
# Add an explicit sequence
408-
if match.group(1) != f"{column.table.name}_{column.name}_seq":
410+
if match.group(2) != f"{column.table.name}_{column.name}_seq":
411+
callable_kwargs = {}
412+
if match.group(1):
413+
callable_kwargs["schema"] = repr(match.group(1))
414+
409415
args.append(
410-
render_callable("Sequence", repr(match.group(1)))
416+
render_callable(
417+
"Sequence",
418+
repr(match.group(2)),
419+
kwargs=callable_kwargs,
420+
)
411421
)
412422
self.add_literal_import("sqlalchemy", "Sequence")
413423

tests/test_generators.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import pytest
66
from _pytest.fixtures import FixtureRequest
7-
from sqlalchemy import PrimaryKeyConstraint
7+
from sqlalchemy import PrimaryKeyConstraint, Sequence
88
from sqlalchemy.dialects import mysql, postgresql
99
from sqlalchemy.dialects.postgresql import UUID
1010
from sqlalchemy.engine import Engine, create_engine
@@ -933,6 +933,37 @@ def test_postgresql_sequence_nonstandard_name(
933933
""",
934934
)
935935

936+
@pytest.mark.parametrize("engine", ["postgresql"], indirect=["engine"])
937+
def test_postgresql_sequence_with_schema(self, generator: CodeGenerator) -> None:
938+
Table(
939+
"simple_items",
940+
generator.metadata,
941+
Column(
942+
"id",
943+
INTEGER,
944+
primary_key=True,
945+
server_default=text("nextval('\"myschema\".test_seq'::regclass)"),
946+
),
947+
schema="myschema",
948+
)
949+
950+
validate_code(
951+
generator.generate(),
952+
"""\
953+
from sqlalchemy import Column, Integer, MetaData, Sequence, Table
954+
955+
metadata = MetaData()
956+
957+
958+
t_simple_items = Table(
959+
'simple_items', metadata,
960+
Column('id', Integer, Sequence('test_seq', schema='myschema'), \
961+
primary_key=True),
962+
schema='myschema'
963+
)
964+
""",
965+
)
966+
936967

937968
class TestDeclarativeGenerator:
938969
@pytest.fixture

0 commit comments

Comments
 (0)