]> 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:04:45 +0000 (12:04 -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

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 2740397afdaa5a7b1a56a96afa328296f2b57be2..8830cb0c1990f8213b054ef647f98e7877c7d08e 100644 (file)
@@ -2806,7 +2806,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 a2887626252eef65253d6d1193d8fea4dc86ca6c..b8cbea819a363c2ac20d7b90232649d438f10835 100644 (file)
@@ -397,6 +397,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