ModelsMigrationsSync:add correct server_default check for Enum

If Column which type is Enum has server_default it is compared
incorrectly for PostgreSQL.

For example, Column('test', sa.Enum('one', 'two', name='enum'),
                     server_default='one').
In model it has DefaultClause('one', for_update=False)) alembic
finds it different from server variant "'one'::enum".

Change-Id: Id30858f9c4c7a2bfb7f9313d47930845fe354a70
This commit is contained in:
Ann Kamyshnikova
2014-09-11 15:03:40 +04:00
parent cc7ae9fecc
commit 436dfdc737
2 changed files with 14 additions and 1 deletions

View File

@@ -395,7 +395,11 @@ class ModelsMigrationsSync(object):
@_compare_server_default.dispatch_for('postgresql')
def _compare_server_default(bind, meta_col, insp_def, meta_def):
if isinstance(meta_col.type, sqlalchemy.String):
if isinstance(meta_col.type, sqlalchemy.Enum):
if meta_def is None or insp_def is None:
return meta_def != insp_def
return insp_def != "'%s'::%s" % (meta_def.arg, meta_col.type.name)
elif isinstance(meta_col.type, sqlalchemy.String):
if meta_def is None or insp_def is None:
return meta_def != insp_def
return insp_def != "'%s'::character varying" % meta_def.arg

View File

@@ -191,6 +191,9 @@ class ModelsMigrationSyncMixin(test.BaseTestCase):
sa.Column('defaulttest', sa.Integer, server_default='5'),
sa.Column('defaulttest2', sa.String(8), server_default=''),
sa.Column('defaulttest3', sa.String(5), server_default="test"),
sa.Column('defaulttest4', sa.Enum('first', 'second',
name='testenum'),
server_default="first"),
sa.UniqueConstraint('spam', 'eggs', name='uniq_cons'),
)
@@ -214,6 +217,9 @@ class ModelsMigrationSyncMixin(test.BaseTestCase):
server_default='')
defaulttest3 = sa.Column('defaulttest3', sa.String(5),
server_default="test")
defaulttest4 = sa.Column('defaulttest4', sa.Enum('first', 'second',
name='testenum'),
server_default="first")
bar = sa.Column('bar', sa.Numeric(10, 5))
class ModelThatShouldNotBeCompared(BASE):
@@ -248,6 +254,9 @@ class ModelsMigrationSyncMixin(test.BaseTestCase):
sa.Column('defaulttest', sa.Integer, server_default='7'),
sa.Column('defaulttest2', sa.String(8), server_default=''),
sa.Column('defaulttest3', sa.String(5), server_default="fake"),
sa.Column('defaulttest4',
sa.Enum('first', 'second', name='testenum'),
server_default="first"),
sa.UniqueConstraint('spam', 'foo', name='uniq_cons'),
)