【问题标题】:Google Cloud Platform SQL instance connection to python app谷歌云平台 SQL 实例连接到 python 应用程序
【发布时间】:2021-02-22 15:36:17
【问题描述】:

我正在基于FlaskGoogle Cloud Platform 上部署一个python3.8 应用程序。

我设法创建并连接到它的 SQL 实例,并与该实例交互(允许我的本地 IP 入站连接到实例)在初始化数据库后直接从我的本地计算机启动应用程序(遵循 this guide) :

flask db init
flask db migrate
flask db upgrade

允许我将本地机器连接到 SQL 实例的配置字符串是(config.py):

SQLALCHEMY_DATABASE_URI = f"mysql+mysqldb://root:{PASSWORD}@{PUBLIC_IP_ADDRESS}/{DBNAME}?unix_socket=/cloudsql/{PROJECT_ID}:{INSTANCE_NAME}"

现在,如果我在 config.py 中使用此行部署应用程序并尝试从我的 GCP 应用程序页面与数据库交互,则无法连接到数据库。看起来它尝试作为外部应用程序连接(就像我的本地计算机一样)并被拒绝(因为我从未允许应用程序引擎实例的入站连接,因为它没有静态 IP)。

我想 SQL 实例已经以某种方式连接到我的应用程序,我可以通过一些本地链接访问它,有人知道怎么做吗?

【问题讨论】:

    标签: python google-app-engine flask google-cloud-platform


    【解决方案1】:

    你是对的。作为 App Engine 一个无服务器平台,尝试将与运行您的代码的每个单独实例关联的每个不同 IP 列入白名单或将与 App Engine 服务对应的所有IP address ranges 列入白名单都没有多大意义。

    如果您使用灵活或标准,具体情况可能会有所不同。我相信您正在使用 App Engine Standard 并且使用 Unix 套接字以及 Cloud SQL 的连接名称可能足以完成这样的连接。找到相关代码sn -p here

    SQLALCHEMY 的以下连接字符串应该可以工作:

    mysql+pymysql://<db_user>:<db_pass>@/<db_name>?unix_socket=<socket_path>/<cloud_sql_instance_name> 
    

    请注意,它使用与您不同的驱动程序,并且不包括实例的公共 IP 地址。

    如果您仍然遇到此问题,请尝试添加您的 requirements.txt 文件并指定您使用的是 App Engine Flex 还是 Standard。

    【讨论】:

    • 感谢@daniel,我已经使用它了:SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://root:{PASSWORD}@/{DBNAME}?unix_socket=/cloudsql/{PROJECT_ID}:{INSTANCE_ZONE}:{INSTANCE_NAME}" 你在哪里可以找到socket_path 信息?
    • socket 路径应该是 /cloudsql/ 你已经猜到了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2020-12-27
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多