python - 带有 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')
也会导致上述错误。
任何想法表示赞赏。谢谢你的时间
干杯,戴夫
解决方案
调用该create_engine
方法时,它会创建必要的对象,但实际上并不尝试连接到数据库。
[create_engine] 创建一个
Dialect
针对 [连接字符串中的数据库] 量身定制的对象,以及一个Pool
在第一次收到连接请求时将在 [host]:[port] 建立 DBAPI 连接的对象。
您从 MySQL 收到的错误消息可能是由于尚未创建Cloud SQL Auth 代理的特殊用户帐户。
您需要在 CloudSQL (MySQL) ('[USER_NAME]'@'cloudsqlproxy~%'
或'[USER_NAME]'@'cloudsqlproxy~[IP_ADDRESS]'
) 中创建一个用户。
推荐阅读
- mesos - Mesos slave 不提供资源
- algorithm - 翻转二维列表(或列表列表)的维度,其中每个子列表的长度相同
- mysql - 使用 MYSQL 防止用户多次参与调查
- android - RecyclerView 在 MotionLayout 中的其他视图上跳转
- php - 创建一个任何人都可以执行的 shell.sh,它在内部以 root 身份运行
- javascript - 获取请求会产生包含数据的响应,但是当专门访问 .data 时会产生未定义的
- html - HTML 类拒绝查看 CSS 文件
- android - AVD 无法上网
- php - 在php中,require和require_once有什么区别
- ruby - 通过循环添加一个数字