SQLAlchemy 可以与 Google Cloud SQL 一起使用吗?

Posted

技术标签:

【中文标题】SQLAlchemy 可以与 Google Cloud SQL 一起使用吗?【英文标题】:Can SQLAlchemy be used with Google Cloud SQL? 【发布时间】:2012-06-01 13:16:20 【问题描述】:

我查看了 Google Cloud SQL 的文档和各种搜索,但我不知道是否可以将 SQLAlchemy 与 Google Cloud SQL 一起使用,如果可以,连接 URI 应该是什么。

我正在寻找使用 Flask-SQLAlchemy 扩展并需要这样的连接字符串: mysql://username:password@server/db

我看到了 Django 示例,但似乎配置使用了与连接字符串不同的样式。 https://developers.google.com/cloud-sql/docs/django

谷歌云 SQL 文档: https://developers.google.com/cloud-sql/docs/developers_guide_python

【问题讨论】:

【参考方案1】:

更新

Google Cloud SQL 现在支持直接访问,因此现在可以使用 MySQLdb 方言。通过 mysql 方言推荐的连接是使用 URL 格式:

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

mysql+gaerdbmshas been deprecated 在 SQLAlchemy 1.0 版以后

我将在下面留下原始答案,以防其他人仍然觉得它有帮助。


对于稍后访问此问题的人(并且不想阅读所有 cmets),SQLAlchemy 现在支持使用连接字符串/方言的 Google Cloud SQL 版本 0.7.8(请参阅:docs):

mysql+gaerdbms:///<dbname>

例如:

create_engine('mysql+gaerdbms:///mydb', connect_args="instance":"myinstance")

我向mysql+gaerdmbs:// 方言提出了update,以支持从非Google App Engine 生产实例(例如。您的开发工作站)。该更改还将通过将项目和实例作为字符串的一部分包含在连接字符串中而略微修改,并且不需要通过 connect_args 单独传递。

例如

mysql+gaerdbms:///<dbname>?instance=<project:instance>

这还可以让您更轻松地将 Cloud SQL 与 Flask-SQLAlchemy 或其他未明确调用 create_engine() 的扩展一起使用。

如果您在从开发工作站连接到 Google Cloud SQL 时遇到问题,您可能想在此处查看我的答案 - https://***.com/a/14287158/191902。

【讨论】:

仅供任何偶然发现此答案的人参考:SQLAlchemy 不再推荐此方法;改用 MySQLdb 方言:doc link【参考方案2】:

是的,

如果您在 SA+Cloud SQL 中发现任何错误,请告诉我。我编写了集成到 SQLAlchemy 中的方言代码。关于 Cloud SQL 如何冒泡异常,这有点愚蠢,因此可能会有一些松散的结局。

【讨论】:

【参考方案3】:

对于那些更喜欢PyMySQL 而不是MySQLdb(在接受的答案中建议)的人,SQLAlchemy 连接字符串是:

用于生产

mysql+pymysql://&lt;USER&gt;:&lt;PASSWORD&gt;@/&lt;DATABASE_NAME&gt;?unix_socket=/cloudsql/&lt;PUT-SQL-INSTANCE-CONNECTION-NAME-HERE&gt;

请务必

    将 SQL 实例添加到您的 app.yaml

    beta_settings:
        cloud_sql_instances: <PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>
    

    启用 SQL 管理 API as it seems to be necessary:

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

本地发展

mysql+pymysql://&lt;USER&gt;:&lt;PASSWORD&gt;@localhost:3306/&lt;DATABASE_NAME&gt;

假设您使用以下方式启动 Cloud SQL 代理:

cloud_sql_proxy -instances=&lt;PUT-SQL-INSTANCE-CONNECTION-NAME-HERE&gt;=tcp:3306

【讨论】:

这是目前使用pymysql 仍然有效的方法。我无法验证使用 mysqldb 的 SQLAlchemy 文档建议,因为这对我不起作用。【参考方案4】:

这是可行的,虽然我根本没有使用过 Flask,所以我不确定通过它建立连接。我通过 Pyramid 让它工作并在这里向 SQLAlchemy 提交了一个补丁(可能是错误的 repo):

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 会引发不同的异常,因此我们遇到了自动部署数据库等问题。您还需要使用第二个补丁中提到的 NullPool 禁用连接池。

我们已经开始通过 NDB 使用数据存储,所以我已经有一段时间没有关注这些修复的进展了..

【讨论】:

您能分享一下决定搬到 NDB 的原因吗? 基本上我们认为它更适合我们正在做的事情。我们开始使用 SQLAlchemy 是因为我们了解 SQL/RDBMS,并且我们认为它至少是目前最好的 Python ORMS 之一(经过一些有限的研究)。但最终,将 RDBMS 映射到代码中的对象的复杂性似乎只是在浪费精力,因为您可以简单地将这些对象直接存储到 no-sql 数据存储区。 我正在考虑将 SQL 用于一个重点关注报告的项目,因为 GAE 数据存储 (db/ndb) 的 NoSQL 特性在没有大量 de 的情况下不容易使用-规范化和地图减少。如果 GAE 有类似 Apache Hive 之类的东西,那就太好了,但我现在离题了。我将研究 SQLAlchemy 问题的变更集并从那里开始。我可能会重新使用 DataStore 并解决复杂问题。我知道这绝对是可能的(所有 Google 都是这样工作的),只是对我们的团队来说更复杂。 那不是 BigQuery 吗? ;) developers.google.com/bigquery/docs/overview 我刚刚将票 2484 中的上述补丁提交到 0.7.8 和 0.8。 0.7.8 尚未发布,但您可以从download page 底部附近的快照中获取。【参考方案5】:

PostgreSQL、pg8000 和 flask_sqlalchemy

添加信息以防有人在寻找如何使用flask_sqlalchemyPostgreSQL:使用pg8000 作为驱动程序,工作连接字符串是

postgres+pg8000://<db_user>:<db_pass>@/<db_name>

【讨论】:

以上是关于SQLAlchemy 可以与 Google Cloud SQL 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

[bzoj1116][POI2008][CLO]

利用sqlalchemy 查询视图

Google Maps API v3 infowindow 关闭事件/回调?

SQLAlchemySQLAlchemy修改查询字段列名

pyhton ORM框架SQLAlchemy基础与建表

SQLAlchemy会话与事务控制:互斥锁和共享锁