Python连接CloudSQL PostgreSQL数据库报错排查求助
GCP CloudSQL PostgreSQL 连接错误排查与解决
1. AttributeError: module 'google.cloud.sql.connector.connector' has no attribute 'connect'
原因:google-cloud-sql-connector版本更新后API变更,旧代码直接调用connector.connect的写法已废弃,新版本需要先实例化Connector类再调用连接方法。
解决方法:修改导入和连接逻辑,先创建Connector实例再调用connect:
from google.cloud.sql.connector import Connector # 实例化Connector对象 connector = Connector() # 调用实例的connect方法 conn = connector.connect(...)
2. ConnectionRefusedError: [Errno 61] Connection refused
原因:
- CloudSQL实例未配置允许本地连接:比如公网IP未将本地IP加入授权网络,或私有IP环境下本地未接入对应VPC。
- 连接器未正确代理到CloudSQL实例,导致尝试连接本地5432端口(默认PostgreSQL端口)。
解决方法: - 公网IP连接:登录GCP控制台,找到对应CloudSQL实例,在「连接」>「授权网络」中添加本地公网IP。
- 私有IP连接:确保本地通过Cloud VPN、Cloud Interconnect或VPC peering接入实例所在VPC;或改用Cloud SQL Auth Proxy辅助连接。
- 检查实例连接名是否正确,避免因名称错误导致连接器无法定位实例。
3. 400 Bad Request (调用connectSettings接口失败)
原因:实例连接名格式错误或拼写错误,导致SQL Admin API无法识别目标实例。实例连接名必须严格遵循项目ID:区域:实例名格式。
解决方法:
- 核对GCP控制台中实例的「连接名」字段,确保项目ID、区域、实例名拼写完全一致,无空格或多余符号。
- 比如你的实例正确连接名应为
angelic-hexagon-307814:us-central1:sqlpg1234,确认代码中传入的是这个值。
4. 401 UNAUTHENTICATED (凭证缺失)
原因:本地未配置GCP认证凭证,导致无法调用SQL Admin API获取实例连接信息。
解决方法:
- 开发环境:安装gcloud CLI后执行
gcloud auth application-default login,按提示完成登录,生成应用默认凭证。 - 生产环境:创建具有
Cloud SQL Client角色的服务账号,下载密钥文件,设置环境变量:export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your-service-account-key.json"
修正后的完整代码
# Copyright 2021 Google LLC. # SPDX-License-Identifier: Apache-2.0 import os from google.cloud.sql.connector import Connector import pg8000 # 初始化Connector connector = Connector() def get_db_connection(): return connector.connect( os.getenv("CLOUD_SQL_INSTANCE"), # 环境变量存实例连接名:angelic-hexagon-307814:us-central1:sqlpg1234 "pg8000", user=os.getenv("DB_USER"), # 环境变量存数据库用户名:test1 password=os.getenv("DB_PASS"), # 环境变量存数据库密码:test1 db=os.getenv("DB_NAME") # 环境变量存数据库名:postgres ) # 获取连接并执行查询 conn = get_db_connection() cursor = conn.cursor() try: cursor.execute("SELECT * from accounts") results = cursor.fetchall() for row in results: print(row) finally: # 关闭资源 cursor.close() conn.close() connector.close()
环境变量设置示例
export CLOUD_SQL_INSTANCE="angelic-hexagon-307814:us-central1:sqlpg1234" export DB_USER="test1" export DB_PASS="test1" export DB_NAME="postgres"
内容的提问来源于stack exchange,提问作者sidharth vijayakumar
相关产品推荐
相关产品推荐

