diff options
author | chrisw <unknown> | 2010-09-09 11:53:08 +0100 |
---|---|---|
committer | chrisw <unknown> | 2010-09-09 11:53:08 +0100 |
commit | a7c0c18a52649d1693cff6db7224477eeaa352c9 (patch) | |
tree | 38166ecf7db1723e0d817a20aabe3cb8159c71fd /migrate/tests/changeset/test_changeset.py | |
parent | 5cf42fbf76b035516d55ca0f1d7e95bb7365ae10 (diff) | |
download | sqlalchemy-migrate-a7c0c18a52649d1693cff6db7224477eeaa352c9.tar.gz |
Fix bug with column dropping involving foreign keys.
Bonus: remove_from_table now understands foreign keys
Diffstat (limited to 'migrate/tests/changeset/test_changeset.py')
-rw-r--r-- | migrate/tests/changeset/test_changeset.py | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/migrate/tests/changeset/test_changeset.py b/migrate/tests/changeset/test_changeset.py index 7792105..b1a4aba 100644 --- a/migrate/tests/changeset/test_changeset.py +++ b/migrate/tests/changeset/test_changeset.py @@ -334,6 +334,96 @@ class TestAddDropColumn(fixture.DB): # a crude test for 0.5.x Index('ix_tmp_adddropcol_d1',self.table.c.d1).drop() + def _actual_foreign_keys(self): + from sqlalchemy.schema import ForeignKeyConstraint + result = [] + for cons in self.table.constraints: + if isinstance(cons,ForeignKeyConstraint): + col_names = [] + for col_name in cons.columns: + if not isinstance(col_name,basestring): + col_name = col_name.name + col_names.append(col_name) + result.append(col_names) + result.sort() + return result + + @fixture.usedb() + def test_drop_with_foreign_keys(self): + self.table.drop() + self.meta.clear() + + # create FK's target + reftable = Table('tmp_ref', self.meta, + Column('id', Integer, primary_key=True), + ) + if self.engine.has_table(reftable.name): + reftable.drop() + reftable.create() + + # add a table with two foreign key columns + self.table = Table( + self.table_name, self.meta, + Column('id', Integer, primary_key=True), + Column('r1', Integer, ForeignKey('tmp_ref.id')), + Column('r2', Integer, ForeignKey('tmp_ref.id')), + ) + self.table.create() + + # paranoid check + self.assertEqual([['r1'],['r2']], + self._actual_foreign_keys()) + + # delete one + self.table.c.r2.drop() + + # check remaining foreign key is there + self.assertEqual([['r1']], + self._actual_foreign_keys()) + + @fixture.usedb() + def test_drop_with_complex_foreign_keys(self): + from sqlalchemy.schema import ForeignKeyConstraint + from sqlalchemy.schema import UniqueConstraint + + self.table.drop() + self.meta.clear() + + # create FK's target + reftable = Table('tmp_ref', self.meta, + Column('id', Integer, primary_key=True), + Column('jd', Integer), + UniqueConstraint('id','jd') + ) + if self.engine.has_table(reftable.name): + reftable.drop() + reftable.create() + + # add a table with a complex foreign key constraint + self.table = Table( + self.table_name, self.meta, + Column('id', Integer, primary_key=True), + Column('r1', Integer), + Column('r2', Integer), + ForeignKeyConstraint(['r1','r2'], + [reftable.c.id,reftable.c.jd]) + ) + self.table.create() + + # paranoid check + self.assertEqual([['r1','r2']], + self._actual_foreign_keys()) + + # delete one + self.table.c.r2.drop() + + # check the constraint is gone, since part of it + # is no longer there - if people hit this, + # they may be confused, maybe we should raise an error + # and insist that the constraint is deleted first, separately? + self.assertEqual([], + self._actual_foreign_keys()) + class TestRename(fixture.DB): """Tests for table and index rename methods""" level = fixture.DB.CONNECT |