summaryrefslogtreecommitdiff
path: root/alembic/operations
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-05-10 08:39:57 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2022-05-10 09:59:38 -0400
commit188dd8b2f098e804c8e64956e9c6490d41f1d7ce (patch)
tree1ec45bdb3dfcea29487bc6f9f574d543b1383006 /alembic/operations
parent4790411e319df0a367c4f2adbf18bf3cd1862a0b (diff)
downloadalembic-188dd8b2f098e804c8e64956e9c6490d41f1d7ce.tar.gz
implement full copy for indexes in batch
Fixed issue in batch mode where CREATE INDEX would not use a new column name in the case of a column rename. Indexes were previously being moved to the new table without any steps to rewrite columns. We now vendor the copy approach from table.to_metadata so that there's a new index expressed in terms of the new columns. Change-Id: Ied84232037aee0b2bf2094b3d3474013d7b41b34 Fixes: #1034
Diffstat (limited to 'alembic/operations')
-rw-r--r--alembic/operations/batch.py22
1 files changed, 21 insertions, 1 deletions
diff --git a/alembic/operations/batch.py b/alembic/operations/batch.py
index 308bc2e..7c7de9f 100644
--- a/alembic/operations/batch.py
+++ b/alembic/operations/batch.py
@@ -24,8 +24,10 @@ from sqlalchemy.util import topological
from ..util import exc
from ..util.sqla_compat import _columns_for_constraint
from ..util.sqla_compat import _copy
+from ..util.sqla_compat import _copy_expression
from ..util.sqla_compat import _ensure_scope_for_ddl
from ..util.sqla_compat import _fk_is_self_referential
+from ..util.sqla_compat import _idx_table_bound_expressions
from ..util.sqla_compat import _insert_inline
from ..util.sqla_compat import _is_type_bound
from ..util.sqla_compat import _remove_column_from_collection
@@ -354,7 +356,25 @@ class ApplyBatchImpl:
def _gather_indexes_from_both_tables(self) -> List["Index"]:
assert self.new_table is not None
idx: List[Index] = []
- idx.extend(self.indexes.values())
+
+ for idx_existing in self.indexes.values():
+ # this is a lift-and-move from Table.to_metadata
+
+ if idx_existing._column_flag: # type: ignore
+ continue
+
+ idx_copy = Index(
+ idx_existing.name,
+ unique=idx_existing.unique,
+ *[
+ _copy_expression(expr, self.new_table)
+ for expr in _idx_table_bound_expressions(idx_existing)
+ ],
+ _table=self.new_table,
+ **idx_existing.kwargs,
+ )
+ idx.append(idx_copy)
+
for index in self.new_indexes.values():
idx.append(
Index(