diff options
author | Ryan P. Kelly <rpkelly@cpan.org> | 2014-06-04 21:29:47 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-07 14:13:26 -0400 |
commit | c2c28980bbb025f252402274d58bb0c6b4440e03 (patch) | |
tree | fe3cad55eb36c96fa9227f0a98541fd7e6a8a98b | |
parent | 18722a75b3519ea53b913186cb047f60c331361a (diff) | |
download | alembic-c2c28980bbb025f252402274d58bb0c6b4440e03.tar.gz |
Support autogenerating migrations for tables with 255 or more columns
-rw-r--r-- | alembic/autogenerate/render.py | 27 | ||||
-rw-r--r-- | docs/build/changelog.rst | 8 | ||||
-rw-r--r-- | tests/__init__.py | 4 | ||||
-rw-r--r-- | tests/test_autogen_render.py | 36 |
4 files changed, 63 insertions, 12 deletions
diff --git a/alembic/autogenerate/render.py b/alembic/autogenerate/render.py index 1f05c66..81bd774 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 1de75e7..8837956 100644 --- a/docs/build/changelog.rst +++ b/docs/build/changelog.rst @@ -7,6 +7,14 @@ Changelog .. 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 Fixed bug where foreign key constraints would fail to render in diff --git a/tests/__init__.py b/tests/__init__.py index 85ea5b3..ba8c0eb 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 ba8ba2d..d253410 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, |