diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-01-27 12:28:37 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-01-27 17:43:26 -0500 |
commit | 3d0ab3ddda45564a7f3bbd65c810242b9e673845 (patch) | |
tree | 5a9cb067bd56f9b3cbe5073009791add8b71a887 /alembic/autogenerate | |
parent | c5788bcfaa4892f0d4263aeff4a777e8841f726a (diff) | |
download | alembic-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.py | 37 |
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: |