SQLAlchemy能否与Google Cloud SQL一起使用?

35
我查看了Google Cloud SQL的文档和各种搜索,但无法找出是否可以使用SQLAlchemy与Google Cloud SQL一起使用,如果可以,连接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
5个回答

53

更新

Google Cloud SQL现在支持直接访问,因此可以使用MySQLdb方言。建议通过mysql方言进行连接的URL格式为:

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

mysql+gaerdbms 已经自版本1.0起被SQLAlchemy弃用

为了方便其他用户,我将保留原始回答。


对于那些以后访问这个问题的人(不想阅读所有评论的人),SQLAlchemy现在支持Google Cloud SQL,版本为0.7.8,使用连接字符串/方言(参见:docs):

mysql+gaerdbms:///<dbname>

E.g.:

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

我提出了对mysql+gaerdmbs://方言的更新,以支持从非Google App Engine生产实例(例如您的开发工作站)连接到Cloud SQL时使用Google Cloud SQL APIs (rdbms_apiproxyrdbms_googleapi)。此更改还将略微修改连接字符串,包括项目和实例作为字符串的一部分,并且不需要通过connect_args单独传递。
mysql+gaerdbms:///<dbname>?instance=<project:instance>

这也将使使用Flask-SQLAlchemy或其他扩展与Cloud SQL更加容易,其中您不需要显式地进行create_engine()调用。
如果您在从开发工作站连接到Google Cloud SQL方面遇到问题,您可能需要查看我在此处的答案 - https://dev59.com/mGzXa4cB1Zd3GeqPZvco#14287158

4
供其他找到这篇答案的人参考:SQLAlchemy 不再推荐使用此方法,建议改用 MySQLdb 方言代替。具体请参考文档链接:http://docs.sqlalchemy.org/en/latest/dialects/mysql.html?highlight=appengine#module-sqlalchemy.dialects.mysql.gaerdbms。 - eaj

9

是的,

如果你在SA+Cloud SQL中发现任何错误,请告诉我。我编写了集成到SQLAlchemy中的方言代码。关于Cloud SQL如何传递异常,有一些愚蠢的事情,所以可能会有一些未解决的问题。


7

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

用于生产环境

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

请确保

  1. Add the SQL instance to your app.yaml:

    beta_settings:
        cloud_sql_instances: <PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>
    
  2. Enable the SQL Admin API as it seems to be necessary:

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

用于本地开发

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

假设您已经使用以下命令启动了 Cloud SQL 代理:

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


1
这是目前仍可使用 pymysql 的方法。我无法验证 SQLAlchemy 文档中建议使用 mysqldb 的方法,因为那对我不起作用。 - mrp

5

虽然我一直没有使用过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通过数据存储,因此我已经有一段时间没有关注这些修复进展了。


基本上,我们认为它更适合我们所做的事情。我们开始使用SQLAlchemy是因为我们了解SQL / RDBMS,并且我们认为它至少是最好的Python ORM之一(经过一些有限的研究)。但最终,在您可以直接将这些对象存储到NoSQL数据存储区时,将RDBMS映射到代码中的对象的复杂性似乎只是浪费努力而没有真正充分的理由去那里。 - lecstor
那不就是BigQuery吗? ;) https://developers.google.com/bigquery/docs/overview - lecstor
这个想法曾经被考虑过(现在仍然是),但目前该项目需要报告反映当前数据的要求,而BigQuery需要我们每隔一段时间推送一次CSV文件以进行更改,并且推送的频率受到限制(每分钟2次-https://developers.google.com/bigquery/docs/quota-policy)。根据CloudSQL的表现,我可能会重新考虑它,因为它似乎已经存在一些与连接池类似的问题/限制。我想我只需研究一下使用任务队列将从DataStore(使用NDB API)导出数据排队到BigQuery即可。 - Sean Lynch
我将设置任务队列以每30秒限制1次的速率。我仍然不确定我是否能够完成我需要的查询类型(基于用户权限、日期窗口等有很多视图)。我不确定BigQuery的连接限制是否会妨碍这一点,但我可能可以在NDB导出到BigQuery时去规范化处理来解决这些问题。 - Sean Lynch
1
我刚刚将上述补丁提交到了 0.7.8 和 0.8 的票号 2484 中。0.7.8 还没有发布,但你可以从 下载页面 底部的快照中获取它。 - zzzeek
显示剩余4条评论

1

PostgreSQL, pg8000和flask_sqlalchemy

如果有人正在寻找如何使用flask_sqlalchemyPostgreSQL,请注意:使用pg8000作为驱动程序,有效的连接字符串为:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接