summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan P. Kelly <rpkelly@cpan.org>2014-06-04 21:29:47 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-08-07 14:13:26 -0400
commitc2c28980bbb025f252402274d58bb0c6b4440e03 (patch)
treefe3cad55eb36c96fa9227f0a98541fd7e6a8a98b
parent18722a75b3519ea53b913186cb047f60c331361a (diff)
downloadalembic-c2c28980bbb025f252402274d58bb0c6b4440e03.tar.gz
Support autogenerating migrations for tables with 255 or more columns
-rw-r--r--alembic/autogenerate/render.py27
-rw-r--r--docs/build/changelog.rst8
-rw-r--r--tests/__init__.py4
-rw-r--r--tests/test_autogen_render.py36
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,