]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Include 'p' for get_indexes() query
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 19 Jul 2019 14:40:27 +0000 (10:40 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 19 Jul 2019 17:19:17 +0000 (13:19 -0400)
Added support for reflection of indexes on PostgreSQL partitioned tables,
which was added to PostgreSQL as of version 11.

Fixes: #4771
Change-Id: I9e8e75c4d8a667b4d52d12afbd384e0a8db00466
(cherry picked from commit a739a3449ff20ba90f92305ed4bbdd36e05bc862)

doc/build/changelog/unreleased_13/4771.rst [new file with mode: 0644]
lib/sqlalchemy/dialects/postgresql/base.py
test/dialect/postgresql/test_reflection.py

diff --git a/doc/build/changelog/unreleased_13/4771.rst b/doc/build/changelog/unreleased_13/4771.rst
new file mode 100644 (file)
index 0000000..e40797d
--- /dev/null
@@ -0,0 +1,6 @@
+.. change::
+    :tags: usecase, postgresql
+    :tickets: 4771
+
+    Added support for reflection of indexes on PostgreSQL partitioned tables,
+    which was added to PostgreSQL as of version 11.
index 9463f6e18f04742b47ccb18cc2ef259f5ae64404..6611b3e5bd25b37be6a08a40eeda1dbd12011457 100644 (file)
@@ -3247,7 +3247,7 @@ class PGDialect(default.DefaultDialect):
                             pg_am am
                             on i.relam = am.oid
               WHERE
-                  t.relkind IN ('r', 'v', 'f', 'm')
+                  t.relkind IN ('r', 'v', 'f', 'm', 'p')
                   and t.oid = :table_oid
                   and ix.indisprimary = 'f'
               ORDER BY
index 7e7a82d46974edad5f4ba7e424124f9f6bbd738e..456b9e1734753505ae51289336959c9e8a3a804d 100644 (file)
@@ -111,6 +111,7 @@ class PartitionedReflectionTest(fixtures.TablesTest, AssertsExecutionResults):
             metadata,
             Column("modulus", Integer, nullable=False),
             Column("data", String(30)),
+            Column("q", Integer),
             postgresql_partition_by="range(modulus)",
         )
 
@@ -124,6 +125,9 @@ class PartitionedReflectionTest(fixtures.TablesTest, AssertsExecutionResults):
             ),
         )
 
+        if testing.against("postgresql >= 11"):
+            Index("my_index", dv.c.q)
+
     def test_get_tablenames(self):
         assert {"data_values", "data_values_4_10"}.issubset(
             inspect(testing.db).get_table_names()
@@ -131,11 +135,25 @@ class PartitionedReflectionTest(fixtures.TablesTest, AssertsExecutionResults):
 
     def test_reflect_cols(self):
         cols = inspect(testing.db).get_columns("data_values")
-        eq_([c["name"] for c in cols], ["modulus", "data"])
+        eq_([c["name"] for c in cols], ["modulus", "data", "q"])
 
     def test_reflect_cols_from_partition(self):
         cols = inspect(testing.db).get_columns("data_values_4_10")
-        eq_([c["name"] for c in cols], ["modulus", "data"])
+        eq_([c["name"] for c in cols], ["modulus", "data", "q"])
+
+    @testing.only_on("postgresql >= 11")
+    def test_reflect_index(self):
+        idx = inspect(testing.db).get_indexes("data_values")
+        eq_(
+            idx, [{"column_names": ["q"], "name": "my_index", "unique": False}]
+        )
+
+    @testing.only_on("postgresql >= 11")
+    def test_reflect_index_from_partition(self):
+        idx = inspect(testing.db).get_indexes("data_values_4_10")
+        # note the name appears to be generated by PG, currently
+        # 'data_values_4_10_q_idx'
+        eq_(idx, [{"column_names": ["q"], "name": mock.ANY, "unique": False}])
 
 
 class MaterializedViewReflectionTest(