summaryrefslogtreecommitdiff
path: root/neutron/db/migration/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'neutron/db/migration/__init__.py')
-rw-r--r--neutron/db/migration/__init__.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/neutron/db/migration/__init__.py b/neutron/db/migration/__init__.py
index 55c1443f1f..86cce385af 100644
--- a/neutron/db/migration/__init__.py
+++ b/neutron/db/migration/__init__.py
@@ -12,11 +12,13 @@
# License for the specific language governing permissions and limitations
# under the License.
+import contextlib
import functools
from alembic import context
from alembic import op
import sqlalchemy as sa
+from sqlalchemy.engine import reflection
def skip_if_offline(func):
@@ -122,3 +124,35 @@ def create_table_if_not_exist_psql(table_name, values):
"WHERE NOT table_exist(%(name)r);" %
{'name': table_name,
'columns': values})
+
+
+def remove_foreign_keys(table, foreign_keys):
+ for fk in foreign_keys:
+ op.drop_constraint(
+ name=fk['name'],
+ table_name=table,
+ type_='foreignkey'
+ )
+
+
+def create_foreign_keys(table, foreign_keys):
+ for fk in foreign_keys:
+ op.create_foreign_key(
+ name=fk['name'],
+ source=table,
+ referent=fk['referred_table'],
+ local_cols=fk['constrained_columns'],
+ remote_cols=fk['referred_columns'],
+ ondelete='CASCADE'
+ )
+
+
+@contextlib.contextmanager
+def remove_fks_from_table(table):
+ try:
+ inspector = reflection.Inspector.from_engine(op.get_bind())
+ foreign_keys = inspector.get_foreign_keys(table)
+ remove_foreign_keys(table, foreign_keys)
+ yield
+ finally:
+ create_foreign_keys(table, foreign_keys)