From 7b25a9d6471a1a2d2d6441f7385d6d2bd00537ea Mon Sep 17 00:00:00 2001 From: Ethan Lynn Date: Mon, 13 Apr 2015 18:43:53 +0800 Subject: [PATCH] Fix sqlalchemy migration script 061 for DB2 backend DB2 doesn't support alter column type from string to text, need to add a new column and copy data from old column, and later remove the old column. Closes-Bug: #1443252 Change-Id: I7b3edf6bf7ea0efaf96398a83dad9ebe61caaa23 --- .../versions/061_status_reason_longtext.py | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/heat/db/sqlalchemy/migrate_repo/versions/061_status_reason_longtext.py b/heat/db/sqlalchemy/migrate_repo/versions/061_status_reason_longtext.py index bfa85f225..cc1ee6ee7 100644 --- a/heat/db/sqlalchemy/migrate_repo/versions/061_status_reason_longtext.py +++ b/heat/db/sqlalchemy/migrate_repo/versions/061_status_reason_longtext.py @@ -20,7 +20,20 @@ def upgrade(migrate_engine): for tab_name in ['stack', 'resource', 'software_deployment']: table = sqlalchemy.Table(tab_name, meta, autoload=True) - table.c.status_reason.alter(type=sqlalchemy.Text) + if migrate_engine.name == 'ibm_db_sa': + status_reason = sqlalchemy.Column('new_status_reason', + sqlalchemy.Text) + table.create_column(status_reason) + qry = table.select().execute().fetchall() + for item in qry: + values = {'new_status_reason': item.status_reason} + update = table.update().where( + table.c.id == item.id).values(values) + migrate_engine.execute(update) + table.c.status_reason.drop() + table.c.new_status_reason.alter(name='status_reason') + else: + table.c.status_reason.alter(type=sqlalchemy.Text) def downgrade(migrate_engine): @@ -29,4 +42,17 @@ def downgrade(migrate_engine): for tab_name in ['stack', 'resource', 'software_deployment']: table = sqlalchemy.Table(tab_name, meta, autoload=True) - table.c.status_reason.alter(type=sqlalchemy.String(255)) + if migrate_engine.name == 'ibm_db_sa': + status_reason = sqlalchemy.Column('new_status_reason', + sqlalchemy.String(255)) + table.create_column(status_reason) + qry = table.select().execute().fetchall() + for item in qry: + values = {'new_status_reason': item.status_reason} + update = table.update().where( + table.c.id == item.id).values(values) + migrate_engine.execute(update) + table.c.status_reason.drop() + table.c.new_status_reason.alter(name='status_reason') + else: + table.c.status_reason.alter(type=sqlalchemy.String(255))