difference(['alembic_version'])
metadata_table_names = set(metadata.tables)
+ _compare_tables(conn_table_names, metadata_table_names, inspector, metadata, diffs, autogen_context)
+
+def _compare_tables(conn_table_names, metadata_table_names,
+ inspector, metadata, diffs, autogen_context):
for tname in metadata_table_names.difference(conn_table_names):
diffs.append(("add_table", metadata.tables[tname]))
log.info("Detected added table %r", tname)
removal_metadata = schema.MetaData()
for tname in conn_table_names.difference(metadata_table_names):
+ exists = tname in removal_metadata.tables
t = schema.Table(tname, removal_metadata)
- inspector.reflecttable(t, None)
+ if not exists:
+ inspector.reflecttable(t, None)
diffs.append(("remove_table", t))
log.info("Detected removed table %r", tname)
from sqlalchemy import MetaData, Column, Table, Integer, String, Text, \
Numeric, CHAR, ForeignKey, DATETIME, TypeDecorator
from sqlalchemy.types import NULLTYPE
+from sqlalchemy.engine.reflection import Inspector
from alembic import autogenerate, context
from unittest import TestCase
from tests import staging_env, sqlite_db, clear_staging_env, eq_, \
)
Table('extra', m,
- Column("x", CHAR)
+ Column("x", CHAR),
+ Column('uid', Integer, ForeignKey('user.id'))
)
return m
drop_table('item')
create_table('extra',
sa.Column('x', sa.CHAR(), nullable=True),
+ sa.Column('uid', sa.INTEGER(), nullable=True),
+ sa.ForeignKeyConstraint([uid], ['user.id'], ),
sa.PrimaryKeyConstraint()
)
drop_column('address', 'street')
)
assert not diff
+ def test_dont_barf_on_already_reflected(self):
+ diffs = []
+ from sqlalchemy.util import OrderedSet
+ inspector = Inspector.from_engine(self.bind)
+ autogenerate._compare_tables(
+ OrderedSet(['extra', 'user']), OrderedSet(), inspector,
+ MetaData(), diffs, self.autogen_context
+ )
+ eq_(
+ [(rec[0], rec[1].name) for rec in diffs],
+ [('remove_table', 'extra'), ('remove_table', u'user')]
+ )
+
class AutogenRenderTest(TestCase):
"""test individual directives"""