]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Added a conditional import to the ``gaerdbms`` dialect which attempts
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 2 Feb 2013 23:40:56 +0000 (18:40 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 2 Feb 2013 23:40:56 +0000 (18:40 -0500)
to import rdbms_apiproxy vs. rdbms_googleapi to work
on both dev and production platforms.  Also now honors the
``instance`` attribute.  Courtesy Sean Lynch.
[ticket:2649]

doc/build/changelog/changelog_08.rst
lib/sqlalchemy/dialects/mysql/gaerdbms.py

index 259c59243e1d12309a137af6e4a8c798f8852c62..e35de3b2d56f49f036a57444828a96c6a9ea6ede 100644 (file)
@@ -6,6 +6,15 @@
 .. changelog::
     :version: 0.8.0
 
+    .. change::
+        :tags: bug, mysql, gae
+        :tickets: 2649
+
+      Added a conditional import to the ``gaerdbms`` dialect which attempts
+      to import rdbms_apiproxy vs. rdbms_googleapi to work
+      on both dev and production platforms.  Also now honors the
+      ``instance`` attribute.  Courtesy Sean Lynch.
+
     .. change::
         :tags: bug, sql
         :tickets: 2496
index d84a1e8969edffc9afc41e7b675bcf2acd4bb3d0..a93a78b738c8f9e2f285e8697eea4bce5170120a 100644 (file)
@@ -7,7 +7,7 @@
 .. dialect:: mysql+gaerdbms
     :name: Google Cloud SQL
     :dbapi: rdbms
-    :connectstring: mysql+gaerdbms:///<dbname>?instance=instancename
+    :connectstring: mysql+gaerdbms:///<dbname>?instance=<instancename>
     :url: https://developers.google.com/appengine/docs/python/cloud-sql/developers-guide
 
     This dialect is based primarily on the :mod:`.mysql.mysqldb` dialect with minimal
@@ -35,8 +35,20 @@ class MySQLDialect_gaerdbms(MySQLDialect_mysqldb):
 
     @classmethod
     def dbapi(cls):
-        from google.appengine.api import rdbms
-        return rdbms
+        # from django:
+        # http://code.google.com/p/googleappengine/source/
+        #     browse/trunk/python/google/storage/speckle/
+        #     python/django/backend/base.py#118
+        # see also [ticket:2649]
+        # see also http://stackoverflow.com/q/14224679/34549
+        from google.appengine.api import apiproxy_stub_map
+
+        if apiproxy_stub_map.apiproxy.GetStub('rdbms'):
+            from google.storage.speckle.python.api import rdbms_apiproxy
+            return rdbms_apiproxy
+        else:
+            from google.storage.speckle.python.api import rdbms_googleapi
+            return rdbms_googleapi
 
     @classmethod
     def get_pool_class(cls, url):
@@ -44,9 +56,13 @@ class MySQLDialect_gaerdbms(MySQLDialect_mysqldb):
         return NullPool
 
     def create_connect_args(self, url):
-        return [[], {'database': url.database,
-                     'user': url.username,
-                     'password': url.password}]
+        opts = url.translate_connect_args()
+        # 'dsn' and 'instance' are because we are skipping
+        # the traditional google.api.rdbms wrapper
+
+        opts['dsn'] = ''
+        opts['instance'] = url.query['instance']
+        return [], opts
 
     def _extract_error_code(self, exception):
         match = re.compile(r"^(\d+):").match(str(exception))