diff --git a/docs/changelog.rst b/docs/changelog.rst index 789723e..1b1e803 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -11,6 +11,7 @@ Fixed bugs to :mod:`migrate.exceptions` - cleared up test output and improved testing of deprecation warnings. - some documentation fixes +- fixed bug with column dropping in sqlite (issue 96) 0.6 (11.07.2010) --------------------------- diff --git a/migrate/changeset/databases/sqlite.py b/migrate/changeset/databases/sqlite.py index 01c3642..4136af3 100644 --- a/migrate/changeset/databases/sqlite.py +++ b/migrate/changeset/databases/sqlite.py @@ -35,11 +35,10 @@ class SQLiteHelper(SQLiteCommon): table = self._to_table(column.table) table_name = self.preparer.format_table(table) - # we remove all constraints, indexes so it doesnt recreate them - ixbackup = copy(table.indexes) - consbackup = copy(table.constraints) - table.indexes = set() - table.constraints = set() + # we remove all indexes so as not to have + # problems during copy and re-create + for index in table.indexes: + index.drop() self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name) self.execute() @@ -52,10 +51,6 @@ class SQLiteHelper(SQLiteCommon): self.append('DROP TABLE migration_tmp') self.execute() - # restore indexes, constraints - table.indexes = ixbackup - table.constraints = consbackup - class SQLiteColumnGenerator(SQLiteSchemaGenerator, SQLiteCommon, ansisql.ANSIColumnGenerator): """SQLite ColumnGenerator""" diff --git a/migrate/changeset/schema.py b/migrate/changeset/schema.py index ae951ad..5c62eb1 100644 --- a/migrate/changeset/schema.py +++ b/migrate/changeset/schema.py @@ -568,9 +568,20 @@ populated with defaults self._set_parent(table) def remove_from_table(self, table, unset_table=True): - # TODO: remove indexes, primary keys, constraints, etc + # TODO: remove primary keys, constraints, etc if unset_table: self.table = None + to_drop = set() + for index in table.indexes: + columns = [] + for col in index.columns: + if col.name!=self.name: + columns.append(col) + if columns: + index.columns=columns + else: + to_drop.add(index) + table.indexes = table.indexes - to_drop if table.c.contains_column(self): table.c.remove(self) diff --git a/migrate/tests/changeset/test_changeset.py b/migrate/tests/changeset/test_changeset.py index 8dfff3b..7792105 100644 --- a/migrate/tests/changeset/test_changeset.py +++ b/migrate/tests/changeset/test_changeset.py @@ -299,7 +299,41 @@ class TestAddDropColumn(fixture.DB): # TODO: test quoting # TODO: test non-autoname constraints + @fixture.usedb() + def test_drop_doesnt_delete_other_indexes(self): + # add two indexed columns + self.table.drop() + self.meta.clear() + self.table = Table( + self.table_name, self.meta, + Column('id', Integer, primary_key=True), + Column('d1', String(10), index=True), + Column('d2', String(10), index=True), + ) + self.table.create() + # paranoid check + if SQLA_06: + self.refresh_table() + self.assertEqual( + sorted([i.name for i in self.table.indexes]), + [u'ix_tmp_adddropcol_d1', u'ix_tmp_adddropcol_d2'] + ) + + # delete one + self.table.c.d2.drop() + + # ensure the other index is still there + if SQLA_06: + self.refresh_table() + self.assertEqual( + sorted([i.name for i in self.table.indexes]), + [u'ix_tmp_adddropcol_d1'] + ) + else: + # a crude test for 0.5.x + Index('ix_tmp_adddropcol_d1',self.table.c.d1).drop() + class TestRename(fixture.DB): """Tests for table and index rename methods""" level = fixture.DB.CONNECT