is_server_default: bool = False,
is_index: bool = False,
) -> str:
- if isinstance(value, sql.ClauseElement):
+
+ if isinstance(value, (list, tuple)):
+ rendered = [
+ _render_potential_expr(item, autogen_context) for item in value
+ ]
+ if isinstance(value, tuple):
+ return "(%s%s)" % (
+ ", ".join(rendered),
+ "," if len(rendered) == 1 else "",
+ )
+ else:
+ return "[%s]" % ", ".join(rendered)
+
+ elif isinstance(value, sa_schema.Column):
+ return repr(_ident(getattr(value, "name", None)))
+ elif isinstance(value, sql.ClauseElement):
sql_text = autogen_context.migration_context.impl.render_ddl_sql_expr(
value, is_server_default=is_server_default, is_index=is_index
)
--- /dev/null
+.. change::
+ :tags: bug, autogenerate
+ :tickets: 1258
+
+ Fixed rendering of dialect keyword arguments containing
+ :class:`~sqlalchemy.schema.Column` objects within sequences, such as
+ ``postgresql_include``. These were previously rendered using ``repr()``,
+ producing invalid Python in the generated migration scripts. Column
+ objects within list or tuple values are now correctly rendered as their
+ string column names. Pull request courtesy Ajay Singh.
"['active', 'code'], unique=False, somedialect_foobar='option')",
)
+ @testing.emits_warning("Can't validate argument ")
+ def test_render_add_index_dialect_kwarg_with_columns(self):
+ """test that Column objects in dialect kwargs like
+ postgresql_include are rendered as column name strings,
+ not as raw Column repr.
+ """
+ t = self.table()
+ idx = Index(
+ "test_active_code_idx",
+ t.c.active,
+ somedialect_include=[t.c.code],
+ )
+ op_obj = ops.CreateIndexOp.from_index(idx)
+ eq_ignore_whitespace(
+ autogenerate.render_op_text(self.autogen_context, op_obj),
+ "op.create_index('test_active_code_idx', 'test', "
+ "['active'], unique=False, somedialect_include=['code'])",
+ )
+
def test_render_add_index_batch(self):
"""
autogenerate.render._add_index
"somedialect_foobar='option')",
)
+ @testing.emits_warning("Can't validate argument ")
+ def test_render_drop_index_dialect_kwarg_with_columns(self):
+ """test that Column objects in dialect kwargs like
+ postgresql_include are rendered as column name strings
+ in drop_index, not as raw Column repr.
+ """
+ t = self.table()
+ idx = Index(
+ "test_active_code_idx",
+ t.c.active,
+ somedialect_include=(t.c.code,),
+ )
+ op_obj = ops.DropIndexOp.from_index(idx)
+ eq_ignore_whitespace(
+ autogenerate.render_op_text(self.autogen_context, op_obj),
+ "op.drop_index('test_active_code_idx', table_name='test', "
+ "somedialect_include=('code',))",
+ )
+
def test_add_fk_constraint__dialect_kwargs(self):
t1 = self.table()
t2 = self.table()