]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Added support for reflecting the source of materialized views
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 18 Nov 2015 14:06:33 +0000 (09:06 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 18 Nov 2015 14:06:33 +0000 (09:06 -0500)
to the Postgresql version of the :meth:`.Inspector.get_view_definition`
method.
fixes #3587

doc/build/changelog/changelog_11.rst
lib/sqlalchemy/dialects/postgresql/base.py
test/dialect/postgresql/test_reflection.py

index 9ce3975c2fb3542ba2297368d1034f318a334002..b2012f4ac727e74b9c218ddf7705bcc1e3aee1cf 100644 (file)
 .. changelog::
     :version: 1.1.0b1
 
+    .. change::
+        :tags: bug, postgresql
+        :tickets: 3587
+
+        Added support for reflecting the source of materialized views
+        to the Postgresql version of the :meth:`.Inspector.get_view_definition`
+        method.
+
     .. change::
         :tags: bug, orm
         :tickets: 3582
index abc1b65d9d6cf0afbd42eb74075afc3bce02a65e..ef870a177b7e6af6d03e632e75d6ab88b72627a0 100644 (file)
@@ -1961,11 +1961,27 @@ class PGDialect(default.DefaultDialect):
             current_schema = schema
         else:
             current_schema = self.default_schema_name
-        s = """
-        SELECT definition FROM pg_views
-        WHERE schemaname = :schema
-        AND viewname = :view_name
-        """
+
+        if self.server_version_info >= (9, 3):
+            s = """
+            SELECT definition FROM pg_views
+            WHERE schemaname = :schema
+            AND viewname = :view_name
+
+            UNION
+
+            SELECT definition FROM pg_matviews
+            WHERE schemaname = :schema
+            AND matviewname = :view_name
+
+            """
+        else:
+            s = """
+            SELECT definition FROM pg_views
+            WHERE schemaname = :schema
+            AND viewname = :view_name
+            """
+
         rp = connection.execute(sql.text(s),
                                 view_name=view_name, schema=current_schema)
         if rp:
index ee87e73257cebecfa048402389f2e0fd1329b08c..851facd2a73505dedcda82cb1d84babfbc68b3f9 100644 (file)
@@ -13,6 +13,7 @@ from sqlalchemy import exc
 import sqlalchemy as sa
 from sqlalchemy.dialects.postgresql import base as postgresql
 from sqlalchemy.dialects.postgresql import ARRAY
+import re
 
 
 class ForeignTableReflectionTest(fixtures.TablesTest, AssertsExecutionResults):
@@ -130,6 +131,15 @@ class MaterializedViewReflectionTest(
         insp = inspect(testing.db)
         eq_(set(insp.get_view_names()), set(['test_mview', 'test_regview']))
 
+    def test_get_view_definition(self):
+        insp = inspect(testing.db)
+        eq_(
+            re.sub(
+                r'[\n\t ]+', ' ',
+                insp.get_view_definition("test_mview").strip()),
+            "SELECT testtable.id, testtable.data FROM testtable;"
+        )
+
 
 class DomainReflectionTest(fixtures.TestBase, AssertsExecutionResults):
     """Test PostgreSQL domains"""