mysql+gaerdbms:///
SQLAlchemyのドライバーはrdbms_apiproxy
、Google App Engine インスタンスから Google Cloud SQL にアクセスする場合にのみ使用できる DBAPI を使用するようにセットアップされていることがわかりました。App Engine SDK で提供されているDjango ドライバーと同様に、Google App Engine ではないときにOAuth ベースを使用するようにドライバーを更新するために、SQLAlchemy にチケットを送信しました。rdbms_googleapi は、(リモート SQL コンソール) を使用する DBAPI でもあります。rdbms_googleapi
google_sql.py
更新されたダイアレクトは 0.7.10 および 0.8.0 リリースの一部であると予想されますが、それらが利用可能になるまでは、次の操作を実行できます。
1 -チケット内の更新された方言をファイル (例: gaerdbms_dialect.py) にコピーします。
from sqlalchemy.dialects.mysql.mysqldb import MySQLDialect_mysqldb
from sqlalchemy.pool import NullPool
import re
"""Support for Google Cloud SQL on Google App Engine
Connecting
-----------
Connect string format::
mysql+gaerdbms:///<dbname>?instance=<project:instance>
# Example:
create_engine('mysql+gaerdbms:///mydb?instance=myproject:instance1')
"""
class MySQLDialect_gaerdbms(MySQLDialect_mysqldb):
@classmethod
def dbapi(cls):
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):
# Cloud SQL connections die at any moment
return NullPool
def create_connect_args(self, url):
opts = url.translate_connect_args()
opts['dsn'] = '' # unused but required to pass to rdbms.connect()
opts['instance'] = url.query['instance']
return [], opts
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
2 - カスタム方言を登録します (既存のスキーマを上書きできます)
from sqlalchemy.dialects import registry
registry.register("mysql.gaerdbms", "application.database.gaerdbms_dialect", "MySQLDialect_gaerdbms")
注: 0.8 では、方言を現在のプロセス内に登録できます (上記のように)。古いバージョンの SQLAlchemy を実行している場合は、0.8+ にアップグレードすることをお勧めします。そうしないと、ここで概説されているように方言用に別のインストールを作成する必要があります。
create_engine('...')
3 -プロジェクトとインスタンスが URL のクエリ文字列の一部として提供されるようになったため、URL を更新します。
mysql+gaerdbms:///<dbname>?instance=<project:instance>
例えば:
create_engine('mysql+gaerdbms:///mydb?instance=myproject:instance1')