From 1e0ecce9ed0b319c476f6dba5f159c6b9153b4a7 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 26 May 2012 13:15:35 -0400 Subject: [PATCH] - [feature] Added a new dialect for Google App Engine. [ticket:2484] --- CHANGES | 5 ++ lib/sqlalchemy/dialects/mysql/gaerdbms.py | 61 +++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 lib/sqlalchemy/dialects/mysql/gaerdbms.py diff --git a/CHANGES b/CHANGES index f8aba424e4..938b9babbf 100644 --- a/CHANGES +++ b/CHANGES @@ -27,6 +27,11 @@ CHANGES - oracle - [bug] Added ROWID to oracle.*, [ticket:2483] +- mysql + - [feature] Added a new dialect for Google App + Engine. [ticket:2484] + + 0.7.7 ===== - orm 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 -- 2.47.2