improve diff unit tests to make sure they don't drop data when column type changes; make the code pass the tests

This commit is contained in:
christian.simms
2008-04-11 04:10:50 +00:00
parent d150a89357
commit fc9ad12752
2 changed files with 17 additions and 6 deletions

View File

@@ -135,8 +135,7 @@ class ModelGenerator(object):
for col in missingInModel:
dbTable.columns[col.name].drop()
for modelCol, databaseCol, modelDecl, databaseDecl in diffDecl:
dbTable.columns[databaseCol.name].drop()
modelTable.columns[modelCol.name].create()
databaseCol.alter(modelCol)
else:
# Sqlite doesn't support drop column, so you have to do more:
# create temp table, copy data to it, drop old table, create new table, copy data back.

View File

@@ -14,6 +14,7 @@ class TestSchemaDiff(fixture.DB):
self._connect(self.url)
self.meta = MetaData(self.engine, reflect=True)
self.meta.drop_all() # in case junk tables are lying around in the test database
self.meta = MetaData(self.engine, reflect=True) # needed if we just deleted some tables
self.table = Table(self.table_name,self.meta,
Column('id',Integer(),primary_key=True),
Column('name',UnicodeText()),
@@ -87,7 +88,7 @@ class TestSchemaDiff(fixture.DB):
self.table = Table(self.table_name,self.meta,
Column('id',Integer(),primary_key=True),
Column('name',UnicodeText(length=None)),
Column('data2',UnicodeText(),nullable=True),
Column('data2',Integer(),nullable=True),
)
assertDiff(True, [], [], [self.table_name])
@@ -96,17 +97,21 @@ class TestSchemaDiff(fixture.DB):
assertDiff(False, [], [], [])
# Make sure data is still present.
result = self.engine.execute(self.table.select(), id=dataId)
result = self.engine.execute(self.table.select(self.table.c.id==dataId))
rows = result.fetchall()
self.assertEquals(len(rows), 1)
self.assertEquals(rows[0].name, 'mydata')
# Add data, later we'll make sure it's still present.
result = self.engine.execute(self.table.insert(), id=2, name=u'mydata2', data2=123)
dataId2 = result.last_inserted_ids()[0]
# Change column type in model.
self.meta.remove(self.table)
self.table = Table(self.table_name,self.meta,
Column('id',Integer(),primary_key=True),
Column('name',UnicodeText(length=None)),
Column('data2',Integer(),nullable=True),
Column('data2',UnicodeText(),nullable=True),
)
assertDiff(True, [], [], [self.table_name]) # TODO test type diff
@@ -114,6 +119,13 @@ class TestSchemaDiff(fixture.DB):
self._applyLatestModel()
assertDiff(False, [], [], [])
# Make sure data is still present.
result = self.engine.execute(self.table.select(self.table.c.id==dataId2))
rows = result.fetchall()
self.assertEquals(len(rows), 1)
self.assertEquals(rows[0].name, 'mydata2')
self.assertEquals(rows[0].data2, '123')
# Delete data, since we're about to make a required column.
# Not even using sqlalchemy.PassiveDefault helps because we're doing explicit column select.
self.engine.execute(self.table.delete(), id=dataId)
@@ -123,7 +135,7 @@ class TestSchemaDiff(fixture.DB):
self.table = Table(self.table_name,self.meta,
Column('id',Integer(),primary_key=True),
Column('name',UnicodeText(length=None)),
Column('data2',Integer(),nullable=False),
Column('data2',UnicodeText(),nullable=False),
)
assertDiff(True, [], [], [self.table_name]) # TODO test nullable diff