summaryrefslogtreecommitdiff
path: root/alembic/autogenerate
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2021-01-27 12:28:37 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2021-01-27 17:43:26 -0500
commit3d0ab3ddda45564a7f3bbd65c810242b9e673845 (patch)
tree5a9cb067bd56f9b3cbe5073009791add8b71a887 /alembic/autogenerate
parentc5788bcfaa4892f0d4263aeff4a777e8841f726a (diff)
downloadalembic-3d0ab3ddda45564a7f3bbd65c810242b9e673845.tar.gz
Place index/uq drops before creates
Changed the default ordering of "CREATE" and "DROP" statements indexes and unique constraints within the autogenerate process, so that for example in an upgrade() operation, a particular index or constraint that is to be replaced such as for a casing convention change will not produce any naming conflicts. For foreign key constraint objects, this is already how constraints are ordered, and for table objects, users would normally want to use :meth:`.Operations.rename_table` in any case. Change-Id: I1b20e8ce6e1ea080df5c1738bf2e7ae91c0c40ad Fixes: #786
Diffstat (limited to 'alembic/autogenerate')
-rw-r--r--alembic/autogenerate/compare.py37
1 files changed, 19 insertions, 18 deletions
diff --git a/alembic/autogenerate/compare.py b/alembic/autogenerate/compare.py
index 1b36565..e1d8c80 100644
--- a/alembic/autogenerate/compare.py
+++ b/alembic/autogenerate/compare.py
@@ -244,7 +244,8 @@ def _make_index(params, conn_table):
ix = sa_schema.Index(
params["name"],
*[conn_table.c[cname] for cname in params["column_names"]],
- unique=params["unique"]
+ unique=params["unique"],
+ _table=conn_table
)
if "duplicates_constraint" in params:
ix.info["duplicates_constraint"] = params["duplicates_constraint"]
@@ -705,9 +706,20 @@ def _compare_indexes_and_uniques(
ops.AddConstraintOp.from_constraint(new.const)
)
- for added_name in sorted(set(metadata_names).difference(conn_names)):
- obj = metadata_names[added_name]
- obj_added(obj)
+ for removed_name in sorted(set(conn_names).difference(metadata_names)):
+ conn_obj = conn_names[removed_name]
+ if not conn_obj.is_index and conn_obj.sig in unnamed_metadata_uniques:
+ continue
+ elif removed_name in doubled_constraints:
+ if (
+ conn_obj.sig not in metadata_indexes_by_sig
+ and conn_obj.sig not in metadata_uniques_by_sig
+ ):
+ conn_uq, conn_idx = doubled_constraints[removed_name]
+ obj_removed(conn_uq)
+ obj_removed(conn_idx)
+ else:
+ obj_removed(conn_obj)
for existing_name in sorted(set(metadata_names).intersection(conn_names)):
metadata_obj = metadata_names[existing_name]
@@ -739,20 +751,9 @@ def _compare_indexes_and_uniques(
if msg:
obj_changed(conn_obj, metadata_obj, msg)
- for removed_name in sorted(set(conn_names).difference(metadata_names)):
- conn_obj = conn_names[removed_name]
- if not conn_obj.is_index and conn_obj.sig in unnamed_metadata_uniques:
- continue
- elif removed_name in doubled_constraints:
- if (
- conn_obj.sig not in metadata_indexes_by_sig
- and conn_obj.sig not in metadata_uniques_by_sig
- ):
- conn_uq, conn_idx = doubled_constraints[removed_name]
- obj_removed(conn_uq)
- obj_removed(conn_idx)
- else:
- obj_removed(conn_obj)
+ for added_name in sorted(set(metadata_names).difference(conn_names)):
+ obj = metadata_names[added_name]
+ obj_added(obj)
for uq_sig in unnamed_metadata_uniques:
if uq_sig not in conn_uniques_by_sig: