]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
- [bug] Fix autogenerate bug that prevented
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 28 Dec 2011 15:36:07 +0000 (10:36 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 28 Dec 2011 15:36:07 +0000 (10:36 -0500)
  correct reflection of a foreign-key
  referenced table in the list of "to remove".
  [#16]

CHANGES
alembic/autogenerate.py
tests/test_autogenerate.py

diff --git a/CHANGES b/CHANGES
index 68789a2cbd1eb88b42c78e6e5d84fe1feba47dab..6e5073c7898bdb0c5192852cf7be000b7ff5cd85 100644 (file)
--- a/CHANGES
+++ b/CHANGES
   generated between the two comments
   if no net migrations were present.
 
+- [bug] Fix autogenerate bug that prevented
+  correct reflection of a foreign-key
+  referenced table in the list of "to remove".
+  [#16]
+
 0.1.0
 =====
 - Initial release.  Status of features:
index 3ddf773c11e89ac083caa2ef868ea39a06c83fe0..5c8c6f2bcd196f59aeaffbf80e807ba593fef5cb 100644 (file)
@@ -55,14 +55,20 @@ def _produce_net_changes(connection, metadata, diffs, autogen_context):
                             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)
 
index 6b0308ff8d5d00ffdb31d28b58e8e6f74201fe1e..2beed5888f7efec898ef911293f9e3f97a8d073a 100644 (file)
@@ -1,6 +1,7 @@
 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_, \
@@ -31,7 +32,8 @@ def _model_one():
     )
 
     Table('extra', m,
-        Column("x", CHAR)
+        Column("x", CHAR),
+        Column('uid', Integer, ForeignKey('user.id'))
     )
 
     return m
@@ -192,6 +194,8 @@ class AutogenerateDiffTest(TestCase):
     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')
@@ -250,6 +254,19 @@ class AutogenerateDiffTest(TestCase):
         )
         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"""