From 60655db574d3d17d3f6ccbf5e6e75fbc49bdab91 Mon Sep 17 00:00:00 2001 From: Saif Hakim Date: Thu, 4 Jan 2024 21:55:37 -0800 Subject: [PATCH] render type.impl when type is a TypeDecorator instance Fixes: #1386 --- alembic/autogenerate/render.py | 3 +++ tests/test_autogen_render.py | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/alembic/autogenerate/render.py b/alembic/autogenerate/render.py index 317a6dbe..1d017b31 100644 --- a/alembic/autogenerate/render.py +++ b/alembic/autogenerate/render.py @@ -803,6 +803,9 @@ def _repr_type( if rendered is not False: return rendered + if isinstance(type_, sqltypes.TypeDecorator): + type_ = type_.impl + if hasattr(autogen_context.migration_context, "impl"): impl_rt = autogen_context.migration_context.impl.render_type( type_, autogen_context diff --git a/tests/test_autogen_render.py b/tests/test_autogen_render.py index eeeb92ed..97558696 100644 --- a/tests/test_autogen_render.py +++ b/tests/test_autogen_render.py @@ -33,6 +33,7 @@ from sqlalchemy.sql import literal_column from sqlalchemy.sql import table from sqlalchemy.types import TIMESTAMP +from sqlalchemy.types import TypeDecorator from sqlalchemy.types import UserDefinedType from alembic import autogenerate @@ -1078,6 +1079,21 @@ def test_render_add_column(self): "server_default='5', nullable=True))", ) + def test_render_add_column_type_decorator(self): + self.autogen_context.opts["user_module_prefix"] = None + + class MyType(TypeDecorator): + impl = Integer + + op_obj = ops.AddColumnOp( + "foo", Column("x", MyType, server_default="5") + ) + eq_ignore_whitespace( + autogenerate.render_op_text(self.autogen_context, op_obj), + "op.add_column('foo', sa.Column('x', sa.Integer(), " + "server_default='5', nullable=True))", + ) + @testing.emits_warning("Can't validate argument ") def test_render_add_column_custom_kwarg(self): col = Column(