python - 在 google cloud sql server 中使用 flasksql alchemy 创建数据库
问题描述
我尝试从 Windows 本地机器连接到 gcp postresql SQL-server 中的数据库。我连接了这样的命令:
cloud_sql_proxy -instances=<myProject:us-central1:myInstance>=tcp:0.0.0.0:8080
&
psql -U postgres -h <Public IP address>
现在我需要使用sqlalchemy
. 我试过了
app.config["SQLALCHEMY_DATABASE_URI"] = 'postgres+psycopg2://<db_user>:<db_pass>@<Public IP address>/<myInstance>?host=<myProject:us-central1:myInstance>'
命令后flask db migrate
我得到一个错误:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "<myProject:us-central1:myInstance>" to address: Unknown host
然后我尝试在 myProject:us-central1:myInstance 的末尾创建 / 我得到了另一个错误
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Invalid argument (0x00002726/10022)
Is the server running locally and accepting
connections on Unix domain socket "?host=<myProject:us-central1:myInstance>//.s.PGSQL.8080"?
最后我输入.s.PGSQL.8080
并得到了同样的错误:
server: Invalid argument (0x00002726/10022)
Is the server running locally and accepting
connections on Unix domain socket "?host=<myProject:us-central1:myInstance>//.s.PGSQL.8080/.s.PGSQL.8080"?
请告诉我我应该如何解决我的问题?
解决方案
SQLAlchemy 只想使用实例的 IP,而不是连接名称。它不知道如何将连接名称(带有 <project_id>:<region>:<instance_id> 的位)转换为要连接的实例。这是代理所做的事情之一。
所以你有几个选择:
继续按您的方式使用代理,尽管我不会将 tcp 设置为 0.0.0.0:8080,因为这不是您想要连接到 SQL 数据库的常用方式。我会这样做:
cloud_sql_proxy -instances=<myProject:us-central1:myInstance>=tcp:5432 &
。然后在您的 SQLAlchemy 代码中进行连接,就好像您在本地连接到数据库一样。当您启动代理时,您应该会收到类似“正在侦听端口 127.0.0.1:5432”的消息。这就是您的应用程序将连接到的内容。从 SQLAlchemy 直接连接到数据库。如果您的数据库设置为公共 IP,您可以在 Google Cloud Console 中授权您想要连接的网络(或命令行,如果您习惯使用 gcloud 工具在命令行上)。如果你走这条路,你会从你的 Cloud SQL 实例的概述页面中获取公共 IP,并在连接代码中使用它。
我强烈推荐选项 1,因为选项 2 本身并没有很多安全措施。您必须自己添加安全性,例如,将您的实例设置为仅使用 SSL 连接,然后生成密钥并在 SQLAlchemy 代码中使用私钥来确保安全连接。代理会为您处理所有这些。
推荐阅读
- javascript - JS 插入字符串 ${ }
- react-native - Moment JS 看似返回随机日期
- vba - VBA:通过 HTTPS 下载图片
- ios - 滚动和缩放到 UIImageView 的特定 CGRect
- java - 使用比较器排序
- javascript - update-element.js 中的 Lit-Element 数据加载错误
- javascript - onHeadingChange(event) 获取几何相反位置的单个值
- excel - Excel VBA - For/If 将多个匹配关键字的示例粘贴到一个单元格中,用逗号分隔
- html - 如何在 django 中的安全过滤内容中使用模板标签
- javascript - 将 HTML 添加到 Google 折线图工具提示