Skip to content

Commit 20a50c9

Browse files
Fix rendering of Column objects in dialect kwargs like postgresql_include
Fixes: #1258
1 parent 7b510dc commit 20a50c9

File tree

3 files changed

+69
-1
lines changed

3 files changed

+69
-1
lines changed

alembic/autogenerate/render.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,28 @@ def _drop_table(autogen_context: AutogenContext, op: ops.DropTableOp) -> str:
306306
def _render_dialect_kwargs_items(
307307
autogen_context: AutogenContext, dialect_kwargs: _DialectArgView
308308
) -> list[str]:
309+
def _render_kwarg_value(val: Any) -> str:
310+
if isinstance(val, (list, tuple)):
311+
rendered = [
312+
(
313+
repr(_ident(getattr(item, "name", None)))
314+
if isinstance(item, sa_schema.Column)
315+
else _render_potential_expr(item, autogen_context)
316+
)
317+
for item in val
318+
]
319+
if isinstance(val, tuple):
320+
return "(%s%s)" % (
321+
", ".join(rendered),
322+
"," if len(rendered) == 1 else "",
323+
)
324+
else:
325+
return "[%s]" % ", ".join(rendered)
326+
else:
327+
return _render_potential_expr(val, autogen_context)
328+
309329
return [
310-
f"{key}={_render_potential_expr(val, autogen_context)}"
330+
f"{key}={_render_kwarg_value(val)}"
311331
for key, val in dialect_kwargs.items()
312332
]
313333

docs/build/unreleased/1258.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
.. change::
2+
:tags: bug, autogenerate
3+
:tickets: 1258
4+
5+
Fixed rendering of dialect keyword arguments containing
6+
:class:`~sqlalchemy.schema.Column` objects within sequences, such as
7+
``postgresql_include``. These were previously rendered using ``repr()``,
8+
producing invalid Python in the generated migration scripts. Column
9+
objects within list or tuple values are now correctly rendered as their
10+
string column names. Pull request courtesy Ajay Singh.

tests/test_autogen_render.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,25 @@ def test_render_add_index_custom_kwarg(self):
147147
"['active', 'code'], unique=False, somedialect_foobar='option')",
148148
)
149149

150+
@testing.emits_warning("Can't validate argument ")
151+
def test_render_add_index_dialect_kwarg_with_columns(self):
152+
"""test that Column objects in dialect kwargs like
153+
postgresql_include are rendered as column name strings,
154+
not as raw Column repr.
155+
"""
156+
t = self.table()
157+
idx = Index(
158+
"test_active_code_idx",
159+
t.c.active,
160+
somedialect_include=(t.c.code,),
161+
)
162+
op_obj = ops.CreateIndexOp.from_index(idx)
163+
eq_ignore_whitespace(
164+
autogenerate.render_op_text(self.autogen_context, op_obj),
165+
"op.create_index('test_active_code_idx', 'test', "
166+
"['active'], unique=False, somedialect_include=('code',))",
167+
)
168+
150169
def test_render_add_index_batch(self):
151170
"""
152171
autogenerate.render._add_index
@@ -316,6 +335,25 @@ def test_render_drop_index_custom_kwarg(self):
316335
"somedialect_foobar='option')",
317336
)
318337

338+
@testing.emits_warning("Can't validate argument ")
339+
def test_render_drop_index_dialect_kwarg_with_columns(self):
340+
"""test that Column objects in dialect kwargs like
341+
postgresql_include are rendered as column name strings
342+
in drop_index, not as raw Column repr.
343+
"""
344+
t = self.table()
345+
idx = Index(
346+
"test_active_code_idx",
347+
t.c.active,
348+
somedialect_include=(t.c.code,),
349+
)
350+
op_obj = ops.DropIndexOp.from_index(idx)
351+
eq_ignore_whitespace(
352+
autogenerate.render_op_text(self.autogen_context, op_obj),
353+
"op.drop_index('test_active_code_idx', table_name='test', "
354+
"somedialect_include=('code',))",
355+
)
356+
319357
def test_add_fk_constraint__dialect_kwargs(self):
320358
t1 = self.table()
321359
t2 = self.table()

0 commit comments

Comments
 (0)