]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- An adjustment to the regular expression used to parse MySQL views,
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 22 Dec 2015 17:04:45 +0000 (12:04 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 22 Dec 2015 17:05:12 +0000 (12:05 -0500)
such that we no longer assume the "ALGORITHM" keyword is present in
the reflected view source, as some users have reported this not being
present in some Amazon RDS environments.
fixes #3613

(cherry picked from commit 8c54b14b5c0feee41bd9b9032f6b17b2dbd560a9)

doc/build/changelog/changelog_10.rst
lib/sqlalchemy/dialects/mysql/base.py
test/dialect/mysql/test_reflection.py

index a9b72d2794e4d094c66a429c82ae04d9cb150efc..f9dfe339bb69a64ecad8fa293fe084fe2ab6e586 100644 (file)
 .. changelog::
     :version: 1.0.11
 
+    .. change::
+        :tags: bug, mysql
+        :versions: 1.1.0b1
+        :tickets: 3613
+
+        An adjustment to the regular expression used to parse MySQL views,
+        such that we no longer assume the "ALGORITHM" keyword is present in
+        the reflected view source, as some users have reported this not being
+        present in some Amazon RDS environments.
+
     .. change::
         :tags: bug, mysql
         :versions: 1.1.0b1
index 454e6e8cc6427faeabb205db95a7c568792b88c4..9a1090247177c57bc79cdf594452af38b15a0f48 100644 (file)
@@ -2834,7 +2834,7 @@ class MySQLDialect(default.DefaultDialect):
             schema, table_name))
         sql = self._show_create_table(connection, None, charset,
                                       full_name=full_name)
-        if sql.startswith('CREATE ALGORITHM'):
+        if re.match(r'^CREATE (?:ALGORITHM)?.* VIEW', sql):
             # Adapt views to something table-like.
             columns = self._describe_table(connection, None, charset,
                                            full_name=full_name)
index 172b8edaff296bd7cb99ce8bb608b45ddce0b120..b3173db67048c5a48d7bc5448e93b8168db4825a 100644 (file)
@@ -391,6 +391,37 @@ class ReflectionTest(fixtures.TestBase, AssertsExecutionResults):
         finally:
             meta.drop_all()
 
+    @testing.provide_metadata
+    def test_view_reflection(self):
+        Table('x', self.metadata, Column('a', Integer), Column('b', String(50)))
+        self.metadata.create_all()
+
+        with testing.db.connect() as conn:
+            conn.execute("CREATE VIEW v1 AS SELECT * FROM x")
+            conn.execute(
+                "CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM x")
+            conn.execute(
+                "CREATE ALGORITHM=UNDEFINED VIEW v3 AS SELECT * FROM x")
+            conn.execute(
+                "CREATE DEFINER=CURRENT_USER VIEW v4 AS SELECT * FROM x")
+
+        @event.listens_for(self.metadata, "before_drop")
+        def cleanup(*arg, **kw):
+            with testing.db.connect() as conn:
+                for v in ['v1', 'v2', 'v3', 'v4']:
+                    conn.execute("DROP VIEW %s" % v)
+
+        insp = inspect(testing.db)
+        for v in ['v1', 'v2', 'v3', 'v4']:
+            eq_(
+                [
+                    (col['name'], col['type'].__class__)
+                    for col in insp.get_columns(v)
+                ],
+                [('a', mysql.INTEGER), ('b', mysql.VARCHAR)]
+            )
+
+
     @testing.exclude('mysql', '<', (5, 0, 0), 'no information_schema support')
     def test_system_views(self):
         dialect = testing.db.dialect