From ba8e22b2e29abcbfeac8a25e289191da0e7217c3 Mon Sep 17 00:00:00 2001 From: CaselIT Date: Mon, 4 Jul 2022 22:47:20 +0200 Subject: [PATCH] Ignore reflected expression based indexes this establishes forwads-compatibility for PostgreSQL expression-based index reflection being added in I3e36d557235286c0f7f6d8276272ff9225058d48 Change-Id: I81d7832f254f50dc3417dd3437c2b49ec3a549e2 --- alembic/autogenerate/compare.py | 24 ++++++++++++++++++------ alembic/ddl/postgresql.py | 8 ++++++-- alembic/testing/requirements.py | 5 +++++ tests/test_postgresql.py | 13 +++++-------- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/alembic/autogenerate/compare.py b/alembic/autogenerate/compare.py index 693efae9..5b698151 100644 --- a/alembic/autogenerate/compare.py +++ b/alembic/autogenerate/compare.py @@ -279,12 +279,22 @@ def _compare_tables( upgrade_ops.ops.append(modify_table_ops) -def _make_index(params: Dict[str, Any], conn_table: "Table") -> "Index": +def _make_index( + params: Dict[str, Any], conn_table: "Table" +) -> Optional["Index"]: + exprs = [] + for col_name in params["column_names"]: + if col_name is None: + util.warn( + "Skipping reflected expression-based " + f"index {params['name']!r}" + ) + return None + else: + item = conn_table.c[col_name] + exprs.append(item) ix = sa_schema.Index( - params["name"], - *[conn_table.c[cname] for cname in params["column_names"]], - unique=params["unique"], - _table=conn_table, + params["name"], *exprs, unique=params["unique"], _table=conn_table ) if "duplicates_constraint" in params: ix.info["duplicates_constraint"] = params["duplicates_constraint"] @@ -585,7 +595,9 @@ def _compare_indexes_and_uniques( ) conn_indexes = set( # type:ignore[assignment] - _make_index(ix, conn_table) for ix in conn_indexes + index + for index in (_make_index(ix, conn_table) for ix in conn_indexes) + if index is not None ) # 2a. if the dialect dupes unique indexes as unique constraints diff --git a/alembic/ddl/postgresql.py b/alembic/ddl/postgresql.py index 019eb3c7..5d93803a 100644 --- a/alembic/ddl/postgresql.py +++ b/alembic/ddl/postgresql.py @@ -249,9 +249,13 @@ class PostgresqlImpl(DefaultImpl): while isinstance(expr, UnaryExpression): expr = expr.element if not isinstance(expr, Column): + if sqla_compat.sqla_2: + msg = "" + else: + msg = "; not supported by SQLAlchemy reflection" util.warn( - "autogenerate skipping functional index %s; " - "not supported by SQLAlchemy reflection" % idx.name + "autogenerate skipping functional index " + f"{idx.name!r}{msg}" ) metadata_indexes.discard(idx) diff --git a/alembic/testing/requirements.py b/alembic/testing/requirements.py index 3947272b..68962766 100644 --- a/alembic/testing/requirements.py +++ b/alembic/testing/requirements.py @@ -19,6 +19,11 @@ class SuiteRequirements(Requirements): return exclusions.closed() + @property + def materialized_views(self): + """needed for sqlalchemy compat""" + return exclusions.closed() + @property def unique_constraint_reflection(self): def doesnt_have_check_uq_constraints(config): diff --git a/tests/test_postgresql.py b/tests/test_postgresql.py index 92465754..b9be5cb3 100644 --- a/tests/test_postgresql.py +++ b/tests/test_postgresql.py @@ -1308,6 +1308,9 @@ class PGUniqueIndexAutogenerateTest(AutogenFixtureTest, TestBase): eq_(diffs[0][1].name, "uq_name") eq_(len(diffs), 1) + def _functional_index_warn(self): + return (r"Skip.*refl",) + def test_functional_ix_one(self): m1 = MetaData() m2 = MetaData() @@ -1328,10 +1331,7 @@ class PGUniqueIndexAutogenerateTest(AutogenFixtureTest, TestBase): ) Index("email_idx", func.lower(t2.c.email), unique=True) - with assertions.expect_warnings( - "Skipped unsupported reflection", - "autogenerate skipping functional index", - ): + with assertions.expect_warnings(*self._functional_index_warn()): diffs = self._fixture(m1, m2) eq_(diffs, []) @@ -1365,9 +1365,6 @@ class PGUniqueIndexAutogenerateTest(AutogenFixtureTest, TestBase): unique=True, ) - with assertions.expect_warnings( - "Skipped unsupported reflection", - "autogenerate skipping functional index", - ): + with assertions.expect_warnings(*self._functional_index_warn()): diffs = self._fixture(m1, m2) eq_(diffs, []) -- 2.47.2