From: Mike Bayer Date: Sat, 2 Feb 2013 23:40:56 +0000 (-0500) Subject: Added a conditional import to the ``gaerdbms`` dialect which attempts X-Git-Tag: rel_0_8_0~24^2~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a6697a83e57ef58780e3d6da43f907f88a60e3a8;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git 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. [ticket:2649] --- diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index 259c59243e..e35de3b2d5 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -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 diff --git a/lib/sqlalchemy/dialects/mysql/gaerdbms.py b/lib/sqlalchemy/dialects/mysql/gaerdbms.py index d84a1e8969..a93a78b738 100644 --- a/lib/sqlalchemy/dialects/mysql/gaerdbms.py +++ b/lib/sqlalchemy/dialects/mysql/gaerdbms.py @@ -7,7 +7,7 @@ .. dialect:: mysql+gaerdbms :name: Google Cloud SQL :dbapi: rdbms - :connectstring: mysql+gaerdbms:///?instance=instancename + :connectstring: mysql+gaerdbms:///?instance= :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))