Skip to content

Commit

Permalink
Fix postgres detect serial in autogenerate (#1479)
Browse files Browse the repository at this point in the history
<!-- Provide a general summary of your proposed changes in the Title field above -->
Fixes: sqlalchemy/alembic#1479

### Description
<!-- Describe your changes in detail -->
In sqlalchemy/alembic#73, it tries to detact postgresql serial in autogenerate, so it won't take `nextval('seq'::regclass)` as server default for that column.
But it takes not effect for tables not in search path. This PR fixed it.

### Checklist
<!-- go over following points. check them with an `x` if they do apply, (they turn into clickable checkboxes once the PR is submitted, so no need to do everything at once)

-->

This pull request is:

- [ ] A documentation / typographical error fix
	- Good to go, no issue or tests are needed
- [x] A short code fix
	- please include the issue number, and create an issue if none exists, which
	  must include a complete example of the issue.  one line code fixes without an
	  issue and demonstration will not be accepted.
	- Please include: `Fixes: #<issue number>` in the commit message
	- please include tests.   one line code fixes without tests will not be accepted.
- [ ] A new feature implementation
	- please include the issue number, and create an issue if none exists, which must
	  include a complete example of how the feature would look.
	- Please include: `Fixes: #<issue number>` in the commit message
	- please include tests.

**Have a nice day!**

Closes: #1486
Pull-request: sqlalchemy/alembic#1486
Pull-request-sha: 24df8f906d281df92c531df5a9e1f64d8cdb8527

Change-Id: I50276875bfb1d4f920f0fcd20136337ae09b5384
  • Loading branch information
zhouyizhen authored and sqla-tester committed Jun 5, 2024
1 parent ade17cf commit 34dbe6a
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 17 deletions.
3 changes: 2 additions & 1 deletion alembic/ddl/postgresql.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,8 @@ def autogen_column_reflect(self, inspector, table, column_info):
"join pg_class t on t.oid=d.refobjid "
"join pg_attribute a on a.attrelid=t.oid and "
"a.attnum=d.refobjsubid "
"where c.relkind='S' and c.relname=:seqname"
"where c.relkind='S' and "
"c.oid=cast(:seqname as regclass)"
),
seqname=seq_match.group(1),
).first()
Expand Down
6 changes: 6 additions & 0 deletions docs/build/unreleased/1479.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.. change::
:tags: bug, autogenerate, postgresql
:tickets: 1479

Fixed the detection of serial column in autogenerate with tables
not under default schema on PostgreSQL
44 changes: 28 additions & 16 deletions tests/test_postgresql.py
Original file line number Diff line number Diff line change
Expand Up @@ -859,8 +859,8 @@ def teardown_class(cls):
clear_staging_env()

@provide_metadata
def _expect_default(self, c_expected, col, seq=None):
Table("t", self.metadata, col)
def _expect_default(self, c_expected, col, schema=None, seq=None):
Table("t", self.metadata, col, schema=schema)

self.autogen_context.metadata = self.metadata

Expand All @@ -871,7 +871,7 @@ def _expect_default(self, c_expected, col, seq=None):
insp = inspect(config.db)

uo = ops.UpgradeOps(ops=[])
_compare_tables({(None, "t")}, set(), insp, uo, self.autogen_context)
_compare_tables({(schema, "t")}, set(), insp, uo, self.autogen_context)
diffs = uo.as_diffs()
tab = diffs[0][1]

Expand All @@ -884,12 +884,12 @@ def _expect_default(self, c_expected, col, seq=None):

insp = inspect(config.db)
uo = ops.UpgradeOps(ops=[])
m2 = MetaData()
m2 = MetaData(schema=schema)
Table("t", m2, Column("x", BigInteger()))
self.autogen_context.metadata = m2
_compare_tables(
{(None, "t")},
{(None, "t")},
{(schema, "t")},
{(schema, "t")},
insp,
uo,
self.autogen_context,
Expand All @@ -903,35 +903,47 @@ def _expect_default(self, c_expected, col, seq=None):
c_expected,
)

def test_serial(self):
self._expect_default(None, Column("x", Integer, primary_key=True))
@testing.combinations((None,), ("test_schema",))
def test_serial(self, schema):
self._expect_default(
None, Column("x", Integer, primary_key=True), schema
)

def test_separate_seq(self):
seq = Sequence("x_id_seq")
@testing.combinations((None,), ("test_schema",))
def test_separate_seq(self, schema):
seq = Sequence("x_id_seq", schema=schema)
seq_name = seq.name if schema is None else f"{schema}.{seq.name}"
self._expect_default(
"nextval('x_id_seq'::regclass)",
f"nextval('{seq_name}'::regclass)",
Column(
"x", Integer, server_default=seq.next_value(), primary_key=True
),
schema,
seq,
)

def test_numeric(self):
seq = Sequence("x_id_seq")
@testing.combinations((None,), ("test_schema",))
def test_numeric(self, schema):
seq = Sequence("x_id_seq", schema=schema)
seq_name = seq.name if schema is None else f"{schema}.{seq.name}"
self._expect_default(
"nextval('x_id_seq'::regclass)",
f"nextval('{seq_name}'::regclass)",
Column(
"x",
Numeric(8, 2),
server_default=seq.next_value(),
primary_key=True,
),
schema,
seq,
)

def test_no_default(self):
@testing.combinations((None,), ("test_schema",))
def test_no_default(self, schema):
self._expect_default(
None, Column("x", Integer, autoincrement=False, primary_key=True)
None,
Column("x", Integer, autoincrement=False, primary_key=True),
schema,
)


Expand Down

0 comments on commit 34dbe6a

Please sign in to comment.