在AppEngine(Python)中连接到Google Cloud MySQL数据库



我对此有很多问题,并找到了多种不同类型的语法来执行此操作,到目前为止,它们似乎都不起作用。

https://cloud.google.com/sql/docs/mysql/connect-app-engine 根据谷歌的本教程,SQLalchemy 似乎是 最好的工具,直到现在我都没有。

我按照所有其他说明进行操作,但我不知道在哪里/cloudsql/INSTANCE_CONNECTION_NAME 被列出。 我假设它所指的套接字是 SQL 概述页面上的实例连接页面。我的看起来像MYPROJECT:us-east1:MYSQLINSTANCE。 我还看到一些文档将SQL实例替换为数据库名称,所以我也尝试了一下,但没有运气。

现在我的 Python 连接字符串看起来像

db = sqlalchemy.create_engine(
unix_socket=/cloudsql/MYPROJECT:us-east1:MYSQLINSTANCE
sqlalchemy.engine.url.URL(
drivername='mysql+pymysql',
username=MYUSERNAME,
password=MYPASSWORD,
database=MYDATABASE,
query={
'unix_socket': '/cloudsql/{}'.format('MYPROJECT:us-east1:MYSQLINSTANCE')
}
),
pool_size=10,
max_overflow=2,
pool_timeout=30,  # 30 seconds
pool_recycle=1800,  # 30 minutes
)

现在它告诉我它无法连接到本地主机上的 SQL 实例,即使我显然没有尝试在本地主机上连接。 我尝试连接教程中定义的 App.YAML 中定义的环境变量,并根据我在网上找到的几个不同版本的语法修改了 App.YAML,但实际上似乎没有组合有效。所以现在我只是将变量直接插入我的 main.py,我知道这不太安全。

我还尝试将连接 URL 作为长 URL 进行,例如

db = sqlalchemy.create_engine(
unix_socket=/cloudsql/MYPROJECT:us-east1:MYSQLINSTANCE
sqlalchemy.engine.url.URL(mysql+pymysql://<db_user>:<db_pass>@/<db_name>?unix_socket=/cloudsql/<MYPROJECT>:us-east1:<MYSQLINSTANCE>
),
pool_size=10,
max_overflow=2,
pool_timeout=30,  # 30 seconds
pool_recycle=1800,  # 30 minutes
)

这给了我一个更奇怪的错误,看起来像 无法加载插件:sqlalchemy.dialects:mysql.pymysql://(我在那里输入的那个URL)

我还研究了通过SQL页面上列出的公共IP地址进行连接,但这需要将连接列入白名单,而且我不确定Appengine应用程序将从哪个IP进行连接。无论如何,我不确定此时最好的方法是什么,任何帮助建立这种联系将不胜感激。此时我只是把头撞在墙上。

首先 -<INSTANCE_CONNECTION_STRING>采用<project>:<region>:<instance>格式,可在云SQL实例的"概述"页面上找到(就在IP旁边)。

其次,在 App Engine 标准版中运行时,/cloudsql/<INSTANCE_CONNECTION_STRING>处的套接字会自动供您使用。在本地运行时,需要提供自己的。您可以改为通过 IP 进行连接,也可以使用 cloudsql-proxy 在 App Engine 所在的同一位置创建一个。

为了使 App Engine 连接正常工作,您需要执行一些操作 - 首先,确保您已启用 Cloud SQL Admin API。接下来,您需要确保您用于连接的 IAM 账户具有Cloud SQL Connect角色。转到 IAM 页面并确保服务帐户具有正确的权限(如果您不使用自己的权限,App Engine 具有默认服务帐户)。

错误抱怨"localhost"的原因是 pymysql 正在使用该错误的默认主机,即使正在使用 unix 套接字来尝试连接。

最新更新