From: Ryan P. Kelly Date: Thu, 5 Jun 2014 01:29:47 +0000 (-0400) Subject: Support autogenerating migrations for tables with 255 or more columns X-Git-Tag: rel_0_6_6~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c2c28980bbb025f252402274d58bb0c6b4440e03;p=thirdparty%2Fsqlalchemy%2Falembic.git Support autogenerating migrations for tables with 255 or more columns --- diff --git a/alembic/autogenerate/render.py b/alembic/autogenerate/render.py index 1f05c66d..81bd774a 100644 --- a/alembic/autogenerate/render.py +++ b/alembic/autogenerate/render.py @@ -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 diff --git a/docs/build/changelog.rst b/docs/build/changelog.rst index 1de75e7f..88379567 100644 --- a/docs/build/changelog.rst +++ b/docs/build/changelog.rst @@ -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 diff --git a/tests/__init__.py b/tests/__init__.py index 85ea5b32..ba8c0eb0 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -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( diff --git a/tests/test_autogen_render.py b/tests/test_autogen_render.py index ba8ba2d9..d2534109 100644 --- a/tests/test_autogen_render.py +++ b/tests/test_autogen_render.py @@ -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,