python - 在 Cloud Function 中使用 Cloud SQL (Postgres)
问题描述
我正在尝试使用 Cloud Function Python 脚本连接到运行 PostgreSQL 11 的 Cloud SQL。理想情况下,我想使用一个pandas.DataFrame.to_sql()
需要sqlalchemy.create_engine()
连接的简单连接到数据库。
这是我目前的尝试(我尝试了带/不带/.s.PGSQL.5432
后缀):
engine = sqlalchemy.create_engine('postgresql+psycopg2://USERNAME:PASSWORD@/DB_NAME?host=/cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432')
engine.connect()
我也尝试了谷歌提供的代码示例,它直接使用但也没有用psycopg2
Error: function crashed. Details:
could not connect to server: Connection refused
Is the server running locally and accepting
connections on Unix domain socket "/cloudsql/vida-production:us-central1:vida-ops/.s.PGSQL.5432"?
编辑:
感谢@kurtisvg指出这一点。由于 Cloud Function 正在尝试连接到位于不同项目上的 Cloud SQL。我必须将 Cloud Function 的服务帐户添加到 Cloud SQL 项目的 IAM。
设置 IAM 后,我用来将sqlalchemy
引擎连接到 Cloud SQL 的 Python 代码如下:
# Don't add the "/.s.PGSQL.5432 suffix" because it will already be added back automatically by the library...
engine = sqlalchemy.create_engine('postgresql+psycopg2://USERNAME:PASSWORD@/DB_NAME?host=/cloudsql/INSTANCE_CONNECTION_NAME')
engine.connect()
解决方案
确保检查以下事项:
- 启用 Cloud SQL Admin API
- 确保 Functions 默认服务账户具有
Cloud SQL Client
IAM 角色
如果您在两个项目之间进行连接,请确保启用 Admin API 并向运行您尝试连接的功能的服务帐户授予权限(对于两个项目)。
推荐阅读
- python - 使用指标列的累计天数
- google-sheets - 使用具有多个日期条件和多个 OR 的 COUNTIF
- npm - 我无法登录到 myGet npm 存储库 (sencha/extjs-ce)
- swift - 未解析的标识符“完成”
- javascript - 浏览器中的打字稿产生`ReferenceError:未定义要求`
- sql - 使用 stuff 函数和 xml 路径避免重复
- python - 如何使用条件填充数据?
- ms-word - Word 加载项对话框不反映从父级设置的本地存储值
- android - 三星手机忽略 Captive Portal 意图 (android.net.conn.CAPTIVE_PORTAL)
- php - 如何修复移动浏览器中的导航栏下拉菜单?