fix for issue 96: deleting a column in sqlite shouldn't delete all indexes
bonus: remove_from_table now removes indexes
This commit is contained in:
parent
dceff55ff4
commit
5cf42fbf76
@ -11,6 +11,7 @@ Fixed bugs
|
|||||||
to :mod:`migrate.exceptions`
|
to :mod:`migrate.exceptions`
|
||||||
- cleared up test output and improved testing of deprecation warnings.
|
- cleared up test output and improved testing of deprecation warnings.
|
||||||
- some documentation fixes
|
- some documentation fixes
|
||||||
|
- fixed bug with column dropping in sqlite (issue 96)
|
||||||
|
|
||||||
0.6 (11.07.2010)
|
0.6 (11.07.2010)
|
||||||
---------------------------
|
---------------------------
|
||||||
|
@ -35,11 +35,10 @@ class SQLiteHelper(SQLiteCommon):
|
|||||||
table = self._to_table(column.table)
|
table = self._to_table(column.table)
|
||||||
table_name = self.preparer.format_table(table)
|
table_name = self.preparer.format_table(table)
|
||||||
|
|
||||||
# we remove all constraints, indexes so it doesnt recreate them
|
# we remove all indexes so as not to have
|
||||||
ixbackup = copy(table.indexes)
|
# problems during copy and re-create
|
||||||
consbackup = copy(table.constraints)
|
for index in table.indexes:
|
||||||
table.indexes = set()
|
index.drop()
|
||||||
table.constraints = set()
|
|
||||||
|
|
||||||
self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name)
|
self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name)
|
||||||
self.execute()
|
self.execute()
|
||||||
@ -52,10 +51,6 @@ class SQLiteHelper(SQLiteCommon):
|
|||||||
self.append('DROP TABLE migration_tmp')
|
self.append('DROP TABLE migration_tmp')
|
||||||
self.execute()
|
self.execute()
|
||||||
|
|
||||||
# restore indexes, constraints
|
|
||||||
table.indexes = ixbackup
|
|
||||||
table.constraints = consbackup
|
|
||||||
|
|
||||||
class SQLiteColumnGenerator(SQLiteSchemaGenerator, SQLiteCommon,
|
class SQLiteColumnGenerator(SQLiteSchemaGenerator, SQLiteCommon,
|
||||||
ansisql.ANSIColumnGenerator):
|
ansisql.ANSIColumnGenerator):
|
||||||
"""SQLite ColumnGenerator"""
|
"""SQLite ColumnGenerator"""
|
||||||
|
@ -568,9 +568,20 @@ populated with defaults
|
|||||||
self._set_parent(table)
|
self._set_parent(table)
|
||||||
|
|
||||||
def remove_from_table(self, table, unset_table=True):
|
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:
|
if unset_table:
|
||||||
self.table = None
|
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):
|
if table.c.contains_column(self):
|
||||||
table.c.remove(self)
|
table.c.remove(self)
|
||||||
|
|
||||||
|
@ -299,6 +299,40 @@ class TestAddDropColumn(fixture.DB):
|
|||||||
# TODO: test quoting
|
# TODO: test quoting
|
||||||
# TODO: test non-autoname constraints
|
# 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):
|
class TestRename(fixture.DB):
|
||||||
"""Tests for table and index rename methods"""
|
"""Tests for table and index rename methods"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user