]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Support autogenerating migrations for tables with 255 or more columns
authorRyan P. Kelly <rpkelly@cpan.org>
Thu, 5 Jun 2014 01:29:47 +0000 (21:29 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 7 Aug 2014 18:13:26 +0000 (14:13 -0400)
alembic/autogenerate/render.py
docs/build/changelog.rst
tests/__init__.py
tests/test_autogen_render.py

index 1f05c66def37caadca08c33693eadd851f1fb1cf..81bd774ad53f8b9d1f81483231ff35e7cfb012aa 100644 (file)
@@ -6,6 +6,8 @@ from ..compat import string_types
 
 log = logging.getLogger(__name__)
 
+MAX_PYTHON_ARGS = 255
+
 try:
     from sqlalchemy.sql.naming import conv
     def _render_gen_name(autogen_context, name):
@@ -44,19 +46,24 @@ def _render_potential_expr(value, autogen_context):
         return repr(value)
 
 def _add_table(table, autogen_context):
+    args = [col for col in
+            [_render_column(col, autogen_context) for col in table.c]
+        if col] + \
+        sorted([rcons for rcons in
+            [_render_constraint(cons, autogen_context) for cons in
+                table.constraints]
+            if rcons is not None
+        ])
+
+    if len(args) > MAX_PYTHON_ARGS:
+        args = '*[' + ',\n'.join(args) + ']'
+    else:
+        args = ',\n'.join(args)
+
     text = "%(prefix)screate_table(%(tablename)r,\n%(args)s" % {
         'tablename': table.name,
         'prefix': _alembic_autogenerate_prefix(autogen_context),
-        'args': ',\n'.join(
-            [col for col in
-                [_render_column(col, autogen_context) for col in table.c]
-            if col] +
-            sorted([rcons for rcons in
-                [_render_constraint(cons, autogen_context) for cons in
-                    table.constraints]
-                if rcons is not None
-            ])
-        )
+        'args': args,
     }
     if table.schema:
         text += ",\nschema=%r" % table.schema
index 1de75e7f13b175b1370d24fd3b300c1bb3b386e1..883795671236fa24e9cddb1e83593df5da369204 100644 (file)
@@ -5,6 +5,14 @@ Changelog
 .. changelog::
     :version: 0.6.6
 
+    .. change::
+      :tags: bug
+      :pullreq: github:15
+
+      Autogenerate render will render the arguments within a Table construct
+      using ``*[...]`` when the number of columns/elements is greater than
+      255.  Pull request courtesy Ryan P. Kelly.
+
     .. change::
       :tags: bug
       :pullreq: github:14
index 85ea5b3255f3e68d74f510f539e3b9d5c99d697b..ba8c0eb0365d4967de03216f8ec8d8669b318505 100644 (file)
@@ -29,11 +29,11 @@ testing_config = configparser.ConfigParser()
 testing_config.read(['test.cfg'])
 
 if py33:
-    from unittest.mock import Mock, call
+    from unittest.mock import Mock, call, patch
     from unittest import mock
 else:
     try:
-        from mock import Mock, call
+        from mock import Mock, call, patch
         import mock
     except ImportError:
         raise ImportError(
index ba8ba2d91a5c279e2826cf56c625a9d1280c8dcf..d253410950981ff25440683b633624cac1eac6d5 100644 (file)
@@ -11,6 +11,8 @@ from sqlalchemy.types import TIMESTAMP
 from sqlalchemy.dialects import mysql, postgresql
 from sqlalchemy.sql import and_, column, literal_column
 
+from . import patch
+
 from alembic import autogenerate, util, compat
 from . import eq_, eq_ignore_whitespace, requires_092, requires_09, requires_094
 
@@ -260,6 +262,40 @@ class AutogenRenderTest(TestCase):
             ")"
         )
 
+    @patch("alembic.autogenerate.render.MAX_PYTHON_ARGS", 3)
+    def test_render_table_max_cols(self):
+        m = MetaData()
+        t = Table(
+            'test', m,
+            Column('a', Integer),
+            Column('b', Integer),
+            Column('c', Integer),
+            Column('d', Integer),
+        )
+        eq_ignore_whitespace(
+            autogenerate.render._add_table(t, self.autogen_context),
+            "op.create_table('test',"
+            "*[sa.Column('a', sa.Integer(), nullable=True),"
+            "sa.Column('b', sa.Integer(), nullable=True),"
+            "sa.Column('c', sa.Integer(), nullable=True),"
+            "sa.Column('d', sa.Integer(), nullable=True)])"
+        )
+
+        t2 = Table(
+            'test2', m,
+            Column('a', Integer),
+            Column('b', Integer),
+            Column('c', Integer),
+        )
+
+        eq_ignore_whitespace(
+            autogenerate.render._add_table(t2, self.autogen_context),
+            "op.create_table('test2',"
+            "sa.Column('a', sa.Integer(), nullable=True),"
+            "sa.Column('b', sa.Integer(), nullable=True),"
+            "sa.Column('c', sa.Integer(), nullable=True))"
+        )
+
     def test_render_table_w_fk_schema(self):
         m = MetaData()
         t = Table('test', m,