3

開発ワークステーションから SQLAlchemy 0.7.9 を使用して Google Cloud SQL に接続できませんでした (create_all() を使用してスキーマを生成することを期待しています)。次のエラーを渡すことができません。

sqlalchemy.exc.DBAPIError: (AssertionError) No api proxy found for service "rdbms" None None

を使用してデータベース インスタンスに正常に接続できましたgoogle_sql.py instancename。最初にブラウザーを開いて接続を承認しました ( ~/Library/Preferences/com.google.cloud.plisthttps://developers.google . com/cloud-sql/docs/commandlineは私がすべきことを示しています)

接続をテストするために使用している簡単なアプリケーションを次に示します。

from sqlalchemy import create_engine

engine = create_engine('mysql+gaerdbms:///myapp', connect_args={"instance":"test"})
connection = engine.connect()

完全なスタック トレースは、https: //gist.github.com/4486641 から入手できます。

4

2 に答える 2

4

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_googleapigoogle_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')
于 2013-01-11T21:44:40.673 に答える
3

次のような実用的なサンプルスクリプトがあると思います。同様のことを試してみて、どうなるか教えてもらえますか?

ただし(すでにご存知かもしれませんが)、目標が Google Cloud SQL インスタンスでスキーマを作成することである場合は、ローカルの mysql サーバーに対してスキーマを作成し、mysqldump でダンプしてから、スキーマを Google にインポートできます。クラウド SQL。とにかく、ローカルの mysql サーバーを使用することは、開発にとって非常に便利です。

from sqlalchemy import create_engine
from google.storage.speckle.python.api import rdbms as dbi_driver
from google.storage.speckle.python.api import rdbms_googleapi

INSTANCE = 'YOURPROJECT:YOURINSTANCE'
DATABASE = 'YOURDATABASE'

def get_connection():       
    return rdbms_googleapi.connect('', instance=INSTANCE, database=DATABASE)

def main():
    engine = create_engine(
        'mysql:///YOURPROJECT:YOURINSTANCE/YOURDATABASE',
        module=dbi_driver,
        creator=get_connection,
    )
    print engine.execute('SELECT 1').scalar()

if __name__ == '__main__':
    main()
于 2013-01-10T07:22:07.200 に答える