Flask SQLalchemy无法使用Unix套接字连接到Google Cloud的Postgresql数据库。

5

我正在使用Flask SQLalchemy在我的Google应用引擎标准环境项目中尝试连接到我的GCP Postgresql数据库。 根据Google文档,URL可以按照以下格式创建:

# postgres+pg8000://<db_user>:<db_pass>@/<db_name>?unix_socket=/cloudsql/<cloud_sql_instance_name>

以下是我的代码

from flask import Flask, request, jsonify
import constants

app = Flask(__name__)

# Database configuration from GCP postgres+pg8000
DB_URL = 'postgres+pg8000://{user}:{pw}@/{db}?unix_socket=/cloudsql/{instance_name}'.format(user=user,pw=password,db=dbname, instance_name=instance_name)

app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # silence the 
deprecation warning
sqldb = SQLAlchemy(app)

这是我一直遇到的错误:
File "/env/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 412, in connect return self.dbapi.connect(*cargs, **cparams) TypeError: connect() got an unexpected keyword argument 'unix_socket'
3个回答

7

根据使用的驱动程序不同,指定unix套接字的参数也会有所不同。根据pg8000文档,您需要使用unix_sock而不是unix_socket

要查看应用程序中的上下文,请参阅此示例应用程序


1
感谢@kurtisvg,我尝试更改为unix_sock,但是我开始收到这个错误 line 1184, in init raise InterfaceError("communication error", e) sqlalchemy.exc.InterfaceError: (pg8000.core.InterfaceError) ('communication error', ConnectionRefusedError(111, 'Connection refused')) (Background on this error at: http://sqlalche.me/e/rvf5) - Isaac
3
我能够通过在URL中添加/cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432来解决它。 - Isaac

2

已经过去了1.5年,仍然没有人发布解决方案 :)

无论如何,只需使用以下URI

postgres+psycopg2://<db_user>:<db_pass>@<public_ip>/<db_name>?host=/cloudsql/<cloud_sql_instance_name>

记得将您的系统公共IP地址添加到授权网络中。


1
使用 Flask_SQLAlchemy 版本 2.4.1,我遇到了一个错误 - “无法加载插件:sqlalchemy.dialects:postgres.psycopg2”。请将代码中的“postgres+psycopg2”更改为“postgresql”。 - buzz11
@buzz11 这个链接应该可以解决你的问题:https://dev59.com/3lsX5IYBdhLWcg3wd_PS#37281686 - Debdut Goswami
通过云 SQL 代理连接不需要添加任何授权网络,只需要公共 IP。甚至有一个组织策略 sql.restrictAuthorizedNetworks 禁止添加授权网络,以便公共 IP 只能与代理一起使用。 - Michał Łazowik

0

文档示例

正如您可以在gcloud指南中阅读的那样,一个典型的连接字符串是

postgres+pg8000://<db_user>:<db_pass>@/<db_name>?unix_sock=<socket_path>/<cloud_sql_instance_name>/.s.PGSQL.5432

引擎和套接字部分的变化

请注意,引擎部分 postgres+pg8000 取决于您的数据库和所使用的驱动程序。此外,根据您的数据库客户端库,套接字部分 ?unix_sock=<socket_path>/<cloud_sql_instance_name>/.s.PGSQL.5432 可能是必需的,也可能可以省略,如下所示:

注意:PostgreSQL 标准要求套接字路径中带有 .s.PGSQL.5432 后缀。一些库会自动应用此后缀,但其他库则需要您按以下方式指定套接字路径:/cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432。

使用 PostgreSQL 和 flask_sqlalchemy

例如,我正在使用 flask_sqlalchemy 作为数据库客户端和 pg8000 作为驱动程序连接到 PostgreSQL 数据库,我的工作连接字符串只需为 postgres+pg8000://<db_user>:<db_pass>@/<db_name>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接