首页 > 解决方案 > 带有 Google Cloud SQL 的 Google Cloud Function:Python SQLalchemy 引擎工作,但连接失败

问题描述

我有一个简单的测试脚本,以确保我可以使用 GCF 连接到 Google Cloud SQL 实例并进行读/写。

def update_db(request):

    import sqlalchemy

    # connect to GCP SQL db
    user = 'root'
    pw = 'XXX'
    conn_name = 'hb-project-319121:us-east4:hb-data'
    db_name = 'Homebase'

    url = 'mysql+pymysql://{}:{}@/{}?unix_socket=/cloudsql/{}'.format(user,pw,db_name,conn_name)
    engine = sqlalchemy.create_engine(url,pool_size=1,max_overflow=0)

    # Returns
    return f'Success'

这是成功的,但是当我尝试添加连接时:

conn = engine.connect()

我收到以下错误:

pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'cloudsqlproxy~' (using password: YES)")

可以创建引擎但无法与之建立连接似乎很奇怪?值得注意的是,任何类型的execute使用引擎,例如engine.execute('select * from table limit 3')也会导致上述错误。

任何想法表示赞赏。谢谢你的时间

干杯,戴夫

标签: pythongoogle-cloud-platformsqlalchemygoogle-cloud-functions

解决方案


调用该create_engine方法时,它会创建必要的对象,但实际上并不尝试连接到数据库。

根据 SQLAlchemy 文档

[create_engine] 创建一个Dialect针对 [连接字符串中的数据库] 量身定制的对象,以及一个Pool在第一次收到连接请求时将在 [host]:[port] 建立 DBAPI 连接的对象。

您从 MySQL 收到的错误消息可能是由于尚未创建Cloud SQL Auth 代理的特殊用户帐户。

您需要在 CloudSQL (MySQL) ('[USER_NAME]'@'cloudsqlproxy~%''[USER_NAME]'@'cloudsqlproxy~[IP_ADDRESS]') 中创建一个用户。


推荐阅读