]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Render Variant types
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 19 Sep 2019 21:40:06 +0000 (17:40 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 20 Sep 2019 00:47:31 +0000 (20:47 -0400)
Added rendering for SQLAlchemy ``Variant`` datatypes, which render as the
base type plus one or more ``.with_variant()`` method calls.

Change-Id: Ic0eea1be911c2fb3e9802ec21ff99815a06602e3
Fixes: #131
alembic/autogenerate/render.py
docs/build/unreleased/131.rst [new file with mode: 0644]
tests/test_autogen_render.py

index 895c3903f954a92667b156e8cd103f23a70f9397..8101637062b0d31e2df3e48fe6519cc272a6a44b 100644 (file)
@@ -679,6 +679,8 @@ def _repr_type(type_, autogen_context):
     elif impl_rt:
         return impl_rt
     elif mod.startswith("sqlalchemy."):
+        if type(type_) is sqltypes.Variant:
+            return _render_Variant_type(type_, autogen_context)
         if "_render_%s_type" % type_.__visit_name__ in globals():
             fn = globals()["_render_%s_type" % type_.__visit_name__]
             return fn(type_, autogen_context)
@@ -696,6 +698,17 @@ def _render_ARRAY_type(type_, autogen_context):
     )
 
 
+def _render_Variant_type(type_, autogen_context):
+    base = _repr_type(type_.impl, autogen_context)
+    for dialect in sorted(type_.mapping):
+        typ = type_.mapping[dialect]
+        base += ".with_variant(%r, %s)" % (
+            dialect,
+            _repr_type(typ, autogen_context),
+        )
+    return base
+
+
 def _render_type_w_subtype(
     type_, autogen_context, attrname, regexp, prefix=None
 ):
diff --git a/docs/build/unreleased/131.rst b/docs/build/unreleased/131.rst
new file mode 100644 (file)
index 0000000..f37edce
--- /dev/null
@@ -0,0 +1,7 @@
+.. change::
+    :tags: usecase, autogenerate
+    :tickets: 131
+
+    Added rendering for SQLAlchemy ``Variant`` datatypes, which render as the
+    base type plus one or more ``.with_variant()`` method calls.
+
index b31c3f8f1c551ddb0f95e97db3aa3a1396d5052e..6202a4f210320ba021fe0b47e5bf321f364a1b02 100644 (file)
@@ -1677,6 +1677,25 @@ class AutogenRenderTest(TestBase):
             "sqlalchemy_util.types.MyType()",
         )
 
+    def test_render_variant(self):
+        from sqlalchemy import VARCHAR, CHAR
+
+        self.autogen_context.opts["user_module_prefix"] = None
+
+        type_ = (
+            String(5)
+            .with_variant(VARCHAR(10), "mysql")
+            .with_variant(CHAR(15), "oracle")
+        )
+
+        # the new Black formatting will help a lot with this
+        eq_ignore_whitespace(
+            autogenerate.render._repr_type(type_, self.autogen_context),
+            "sa.String(length=5)."
+            "with_variant('mysql', sa.VARCHAR(length=10))."
+            "with_variant('oracle', sa.CHAR(length=15))",
+        )
+
     def test_repr_user_type_user_prefix_None(self):
         class MyType(UserDefinedType):
             def get_col_spec(self):