web-dev-qa-db-ja.com

SQLAlchemyをGoogleCloud SQLで使用できますか?

Google Cloud SQLのドキュメントとさまざまな検索を調べましたが、Google Cloud SQLでSQLAlchemyを使用できるかどうか、使用できる場合は接続URIを確認できません。

Flask-SQLAlchemy拡張機能を使用したいと考えており、次のような接続文字列が必要です。mysql://username:password@server/db

Djangoの例を見ましたが、構成が接続文字列とは異なるスタイルを使用しているようです。 https://developers.google.com/cloud-sql/docs/Django

Google Cloud SQLのドキュメント: https://developers.google.com/cloud-sql/docs/developers_guide_python

24
Sean Lynch

更新

Google Cloud SQLが直接アクセスをサポートするようになったため、MySQLdb方言を使用できるようになりました。 mysqlダイアレクトを介した推奨接続は、URL形式を使用することです。

_mysql+mysqldb://root@/<dbname>?unix_socket=/cloudsql/<projectid>:<instancename>
_

_mysql+gaerdbms_ 非推奨 バージョン1.0以降のSQLAlchemy

他の人がまだ役立つと思う場合に備えて、以下の元の回答を残しておきます。


後でこの質問にアクセスする(そしてすべてのコメントを読みたくない)人のために、SQLAlchemyは接続文字列/方言を使用してバージョン0.7.8以降のGoogle Cloud SQLをサポートするようになりました(参照: docs )::

_mysql+gaerdbms:///<dbname>
_

例えば。:

_create_engine('mysql+gaerdbms:///mydb', connect_args={"instance":"myinstance"})
_

_mysql+gaerdmbs://_方言に pdate を提案し、Google Cloud SQL API(_rdbms_apiproxy_と_rdbms_googleapi_)の両方をサポートして非-からCloudSQLに接続しますGoogle App Engineの本番インスタンス(開発ワークステーションなど)。この変更により、プロジェクトとインスタンスを文字列の一部として含めることで接続文字列もわずかに変更され、_connect_args_を介して個別に渡す必要がなくなります。

例えば。

_mysql+gaerdbms:///<dbname>?instance=<project:instance>
_

これにより、明示的にcreate_engine()呼び出しを行わないFlask-SQLAlchemyまたはその他の拡張機能でCloudSQLを簡単に使用できるようになります。

開発ワークステーションからGoogleCloud SQLに接続する際に問題が発生した場合は、こちらの回答をご覧ください https://stackoverflow.com/a/14287158/191902

46
Sean Lynch

はい、

SA + Cloud SQLにバグを見つけた場合は、お知らせください。 SQLAlchemyに統合された方言コードを書きました。 Cloud SQLがどのように例外をバブルアップするかについては少しばかげたビジネスがあるので、そこにはいくつかのルーズエンドがあるかもしれません。

8
Richie Foreman

Flaskをまったく使用していないので、それを介して接続を確立するかどうかはわかりませんが、実行可能です。Pyramidを介して機能させ、SQLAlchemyにパッチを送信しました(おそらく間違ったレポ)ここ:

https://bitbucket.org/sqlalchemy/sqlalchemy/pull-request/2/added-a-dialect-for-google-app-engines

それはその後置き換えられ、SQLAlchemyに受け入れられました。

http://www.sqlalchemy.org/trac/ticket/2484

しかし、リリースに至るまでには至っていないと思います。

Google SQLがさまざまな例外をスローすることにはいくつかの問題があるため、データベースを自動的にデプロイするなどの問題が発生しました。また、2番目のパッチで説明されているように、NullPoolを使用して接続プールを無効にする必要があります。

その後、NDBを介してデータストアを使用するようになりました。そのため、しばらくの間、これらの修正の進行状況を追跡していません。

5
lecstor

MySQLdb (受け入れられた回答で提案されている)よりも PyMySQL を好む人のために、SQLAlchemy接続文字列は次のとおりです。

本番用

mysql+pymysql://<USER>:<PASSWORD>@/<DATABASE_NAME>?unix_socket=/cloudsql/<PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>

必ず

  1. SQLインスタンスをapp.yamlに追加します。

    beta_settings:
        cloud_sql_instances: <PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>
    
  2. SQL管理APIを有効にします 必要と思われるため

    https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview

ローカル開発用

mysql+pymysql://<USER>:<PASSWORD>@localhost:3306/<DATABASE_NAME>

次のコマンドでCloudSQLプロキシを開始したとします。

cloud_sql_proxy -instances=<PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>=tcp:3306

2
Lars Blumberg