【问题标题】:Connecting to a Google Cloud MySQL database in AppEngine(Python)在 AppEngine(Python) 中连接到 Google Cloud MySQL 数据库
【发布时间】:2019-06-14 16:52:36
【问题描述】:

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

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 连接。无论如何,我不确定目前最好的方法是什么,并且非常感谢建立这种联系的任何帮助。在这一点上,我只是用头撞墙。

【问题讨论】:

    标签: google-app-engine google-cloud-platform google-cloud-sql


    【解决方案1】:

    首先 - &lt;INSTANCE_CONNECTION_STRING&gt; 的格式为 &lt;project&gt;:&lt;region&gt;:&lt;instance&gt;,可在您的 Cloud SQL 实例的“概览”页面上找到(就在 IP 旁边)。

    第二 - 在 App Engine 标准中运行时,/cloudsql/&lt;INSTANCE_CONNECTION_STRING&gt; 处的套接字会自动供您使用。在本地运行时,您需要提供自己的。您可以改为通过 IP 连接,或者您可以使用 cloudsql-proxy 在 App Engine 所在的同一位置创建一个。

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

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

    【讨论】:

    • 我启用了 Cloud SQL Admin API 并且 appengine 默认服务帐户具有正确的权限,但我仍然遇到错误。我连接到实例的 Python 字符串实际上应该是什么样子?
    猜你喜欢
    • 2019-11-10
    • 2020-10-31
    • 2021-02-12
    • 2018-10-30
    • 2020-02-16
    • 2018-10-12
    • 1970-01-01
    • 2015-04-01
    • 2020-12-16
    相关资源
    最近更新 更多