]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Ignore reflected expression based indexes
authorCaselIT <cfederico87@gmail.com>
Mon, 4 Jul 2022 20:47:20 +0000 (22:47 +0200)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 14 Jul 2022 15:55:52 +0000 (11:55 -0400)
this establishes forwads-compatibility for
PostgreSQL expression-based index reflection
being added in I3e36d557235286c0f7f6d8276272ff9225058d48

Change-Id: I81d7832f254f50dc3417dd3437c2b49ec3a549e2

alembic/autogenerate/compare.py
alembic/ddl/postgresql.py
alembic/testing/requirements.py
tests/test_postgresql.py

index 693efae9ee494be2594d9ad72bc7e073395cc586..5b698151982af8f787b815080b7cd0d14d1699df 100644 (file)
@@ -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
index 019eb3c74c6d5bc4de582ef23547c91f5ba2494a..5d93803ace143500111c1716e7ab7e38ef361ede 100644 (file)
@@ -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)
 
index 3947272bc145a81f39281a3fd0082bb8c0b1b196..68962766dedf30eaeab53687ef52cb5d8acfaaed 100644 (file)
@@ -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):
index 9246575450b53ad4fe6441d1fb91e29d6742b6fe..b9be5cb381798e3a8bcba5abe7a8f7cfba19b008 100644 (file)
@@ -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, [])