Flask SQLalchemy 无法使用 Unix 套接字连接到 Google Cloud Postgresql 数据库
Posted
技术标签:
【中文标题】Flask SQLalchemy 无法使用 Unix 套接字连接到 Google Cloud Postgresql 数据库【英文标题】:Flask SQLalchemy can't connect to Google Cloud Postgresql database with Unix socket 【发布时间】:2018-12-14 04:36:25 【问题描述】:我在我的谷歌应用引擎标准环境项目中使用 Flask SQLalchemy 来尝试连接到我的 GCP Postgresql 数据库。 根据google docs,可以用这种格式创建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'
【问题讨论】:
【参考方案1】:指定 unix 套接字的参数取决于您使用的驱动程序。根据pg8000 docs,你需要使用unix_sock
而不是unix_socket
。
要在应用程序的上下文中查看此内容,您可以查看此sample application。
【讨论】:
感谢@kurtisvg,我尝试更改为 unix_sock 但我开始收到此错误,而不是第 1184 行,在 init 中引发 InterfaceError("communication error", e) sqlalchemy.exc。 InterfaceError: (pg8000.core.InterfaceError) ('communication error', ConnectionRefusedError(111, 'Connection denied')) (此错误的背景:sqlalche.me/e/rvf5) 我可以通过将 /cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432 添加到 url 来修复它【参考方案2】:已经超过 1.5 年了,还没有人发布解决方案 :)
不管怎样,只要使用下面的 URI
postgres+psycopg2://<db_user>:<db_pass>@<public_ip>/<db_name>?host=/cloudsql/<cloud_sql_instance_name>
是的,不要忘记将您的系统公共 IP 地址添加到授权网络。
【讨论】:
使用flask_sqlalchemy 2.4.1版我最终得到一个错误-“无法加载插件:sqlalchemy.dialects:postgres.psycopg2”与该代码。将“postgres+psycopg2”更改为“postgresql” @buzz11 ***.com/questions/33794074/… 这应该可以解决您的问题。 通过云sql代理连接不需要添加任何授权网络,只需要一个公共IP。甚至还有一个组织策略不允许添加授权网络sql.restrictAuthorizedNetworks
,因此公共 IP 只能与代理一起使用。【参考方案3】:
文档示例
正如您在gcloud guides 中看到的,示例连接字符串是
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
例如,我使用 PostgreSQL,flask_sqlalchemy
作为数据库客户端,pg8000
作为驱动程序,我的工作连接字符串只有postgres+pg8000://<db_user>:<db_pass>@/<db_name>
。
【讨论】:
以上是关于Flask SQLalchemy 无法使用 Unix 套接字连接到 Google Cloud Postgresql 数据库的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 flask-sqlalchemy 创建自动递增主键
AttributeError:使用flask-sqlalchemy连接到sqlite数据库时无法设置属性
Python Flask SQLAlchemy 容器无法连接到 MySQL 容器
Flask 和 Heroku sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:postgres