diff options
author | tilly-Q <nattilypigeonfowl@gmail.com> | 2013-10-09 17:11:41 -0400 |
---|---|---|
committer | tilly-Q <nattilypigeonfowl@gmail.com> | 2013-10-09 17:11:41 -0400 |
commit | e5196ff0006da687ae31466d8c8e384c6be05ccd (patch) | |
tree | 70a1b7545ea5e4103928f3afbe3d53bd0e528528 /mediagoblin/db/migration_tools.py | |
parent | a4609dd32b3b0db2f2317b8b407b515b41bd0127 (diff) | |
download | mediagoblin-e5196ff0006da687ae31466d8c8e384c6be05ccd.tar.lz mediagoblin-e5196ff0006da687ae31466d8c8e384c6be05ccd.tar.xz mediagoblin-e5196ff0006da687ae31466d8c8e384c6be05ccd.zip |
I made some changes in this commit to help out with other people trying to work
around the SQLite problems with Alter table. I added a new function to
migration_tools (replace_table) which does all the work I did in my migration of
core__users, but is now usable for other migrations.
Diffstat (limited to 'mediagoblin/db/migration_tools.py')
-rw-r--r-- | mediagoblin/db/migration_tools.py | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/mediagoblin/db/migration_tools.py b/mediagoblin/db/migration_tools.py index e75f3757..70cd92c8 100644 --- a/mediagoblin/db/migration_tools.py +++ b/mediagoblin/db/migration_tools.py @@ -16,6 +16,7 @@ from mediagoblin.tools.common import simple_printer from sqlalchemy import Table +from sqlalchemy.sql import select class TableAlreadyExists(Exception): pass @@ -286,3 +287,29 @@ def inspect_table(metadata, table_name): """Simple helper to get a ref to an already existing table""" return Table(table_name, metadata, autoload=True, autoload_with=metadata.bind) + +def replace_table(db, old_table,replacement_table): + """A function to fully replace a current table with a new one for migrati- + -ons. This is necessary because some changes are made tricky in some situa- + -tion, for example, dropping a boolean column in sqlite is impossible w/o + this method + + :param old_table A ref to the old table, gotten through + inspect_table + + :param replacement_table A ref to the new table, gotten through + inspect_table""" + surviving_columns = replacement_table.columns.keys() + old_table_name = old_table.name + for row in db.execute(select( + [column for column in old_table.columns + if column.name in surviving_columns])): + + db.execute(replacement_table.insert().values(**row)) + db.commit() + + old_table.drop() + db.commit() + + replacement_table.name=old_table_name + db.commit() |