From: Mike Bayer Date: Sat, 26 May 2012 17:10:40 +0000 (-0400) Subject: - add new google app engine DBAPI, [ticket:2484] X-Git-Tag: rel_0_8_0b1~408 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6b810a9141dcc65cd462066e741937f32fbc745a;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - add new google app engine DBAPI, [ticket:2484] --- diff --git a/CHANGES b/CHANGES index b582658956..3362ccf224 100644 --- a/CHANGES +++ b/CHANGES @@ -387,6 +387,9 @@ CHANGES on first connect. These functions are still available as semi-private. [ticket:2404] + - [feature] Added a new dialect for Google App + Engine. Also in 0.7.8. [ticket:2484] + - oracle - [bug] Quoting information is now passed along from a Column with quote=True when generating diff --git a/lib/sqlalchemy/dialects/mysql/gaerdbms.py b/lib/sqlalchemy/dialects/mysql/gaerdbms.py new file mode 100644 index 0000000000..f84a5d2dd9 --- /dev/null +++ b/lib/sqlalchemy/dialects/mysql/gaerdbms.py @@ -0,0 +1,61 @@ +# mysql/gaerdbms.py +# Copyright (C) 2005-2012 the SQLAlchemy authors and contributors +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +"""Support for Google Cloud SQL on Google App Engine. + +This dialect is based primarily on the :mod:`.mysql.mysqldb` dialect with minimal +changes. + +.. versionadded:: 0.7.8 + +Connecting +---------- + +Connect string format:: + + mysql+gaerdbms:/// + +E.g.:: + + create_engine('mysql+gaerdbms:///mydb', + connect_args={"instance":"instancename"}) + +Pooling +------- + +Google App Engine connections appear to be randomly recycled, +so the dialect does not pool connections. The :class:`.NullPool` +implementation is installed within the :class:`.Engine` by +default. + +""" + +from sqlalchemy.dialects.mysql.mysqldb import MySQLDialect_mysqldb +from sqlalchemy.pool import NullPool +import re + + +class MySQLDialect_gaerdbms(MySQLDialect_mysqldb): + + @classmethod + def dbapi(cls): + from google.appengine.api import rdbms + return rdbms + + @classmethod + def get_pool_class(cls, url): + # Cloud SQL connections die at any moment + return NullPool + + def create_connect_args(self, url): + return [[],{'database':url.database}] + + def _extract_error_code(self, exception): + match = re.compile(r"^(\d+):").match(str(exception)) + code = match.group(1) + if code: + return int(code) + +dialect = MySQLDialect_gaerdbms \ No newline at end of file