diff options
| author | Yuriy Zveryanskyy <yzveryanskyy@mirantis.com> | 2013-06-21 14:44:50 +0300 |
|---|---|---|
| committer | Yuriy Zveryanskyy <yzveryanskyy@mirantis.com> | 2013-06-27 12:26:33 +0300 |
| commit | 957a35204d131c892a7985ecbabd0769c9e5a9ea (patch) | |
| tree | 5de93bfbcb427bbcd94a37f73f66d9257765f348 /nova/db | |
| parent | 82b805ce635ddc9ac062115956a8c40b7ad3b85b (diff) | |
| download | nova-957a35204d131c892a7985ecbabd0769c9e5a9ea.tar.gz nova-957a35204d131c892a7985ecbabd0769c9e5a9ea.tar.xz nova-957a35204d131c892a7985ecbabd0769c9e5a9ea.zip | |
Fix sqlalchemy utils.
This patch affects drop_unique_constraint() on sqlite engine.
1. Fix error for tables with foreign key(s).
2. Now work with tables contains reserved words in
column names ("key" for example).
Fix bug 1195216.
Change-Id: Idc4dfa5006eee115f578b00d675cae1d6241ec69
Diffstat (limited to 'nova/db')
| -rw-r--r-- | nova/db/sqlalchemy/utils.py | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/nova/db/sqlalchemy/utils.py b/nova/db/sqlalchemy/utils.py index 6c0a53846..918f50bfd 100644 --- a/nova/db/sqlalchemy/utils.py +++ b/nova/db/sqlalchemy/utils.py @@ -17,7 +17,7 @@ import re -from migrate.changeset import UniqueConstraint +from migrate.changeset import UniqueConstraint, ForeignKeyConstraint from sqlalchemy import Boolean from sqlalchemy import CheckConstraint from sqlalchemy import Column @@ -101,7 +101,8 @@ def _get_unique_constraints_in_sqlite(migrate_engine, table_name): uniques = set([ schema.UniqueConstraint( - *[getattr(table.c, c.strip()) for c in cols.split(",")], name=name + *[getattr(table.c, c.strip(' "')) + for c in cols.split(",")], name=name ) for name, cols in re.findall(regexp, sql_data) ]) @@ -128,7 +129,8 @@ def _drop_unique_constraint_in_sqlite(migrate_engine, table_name, uc_name, table.constraints.update(uniques) constraints = [constraint for constraint in table.constraints - if not constraint.name == uc_name] + if not constraint.name == uc_name and + not isinstance(constraint, schema.ForeignKeyConstraint)] new_table = Table(table_name + "__tmp__", meta, *(columns + constraints)) new_table.create() @@ -139,12 +141,20 @@ def _drop_unique_constraint_in_sqlite(migrate_engine, table_name, uc_name, indexes.append(Index(index["name"], *column_names, unique=index["unique"])) + f_keys = [] + for fk in insp.get_foreign_keys(table_name): + refcolumns = [fk['referred_table'] + '.' + col + for col in fk['referred_columns']] + f_keys.append(ForeignKeyConstraint(fk['constrained_columns'], + refcolumns, table=new_table, name=fk['name'])) ins = InsertFromSelect(new_table, table.select()) migrate_engine.execute(ins) table.drop() [index.create(migrate_engine) for index in indexes] + for fkey in f_keys: + fkey.create() new_table.rename(table_name) |
