【问题标题】:How to connect to Postgres database on Docker in Windows 10 using SQLAlchemy?如何使用 SQLAlchemy 在 Windows 10 中连接到 Docker 上的 Postgres 数据库?
【发布时间】:2018-07-24 01:31:56
【问题描述】:

我使用 Docker 和以下命令在我的计算机上设置了一个临时 Postgres 数据库用于测试目的:

1)

sudo docker run --name some-postgres6 -e POSTGRES_PASSWORD=mysecretpassword -p 5430:5432 postgres:9.1 -d postgres

2)

sudo docker run -it --rm --link some-postgres6:postgres postgres psql -h postgres -U postgres

我想使用 Python 连接到数据库:

from sqlalchemy.engine import create_engine
import psycopg2

engine = create_engine('postgresql+psycopg2://postgres:mysecretpassword@localhost/mydb?port=5432') ### IMPORTANT!!!
connection = engine.connect()

然后我收到此错误:

psycopg2.OperationalError: could not connect to server: Connection refused (0x0000274D/10061)
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused (0x0000274D/10061)
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?

这段代码曾经在我运行 Ubuntu 的另一台机器上运行。我想这与windows有关。我正在运行 Windows 10 Home(没有 Windows 经验)并使用 Docker 工具箱。

【问题讨论】:

  • 你能从psql连接吗?
  • 从 psql 工作连接
  • 那是 Windows,您查看过您的防火墙/防病毒日志吗?他们可以有足够的眼光让psql.exe 连接,但阻止python.exe。
  • 不,防病毒软件没有阻止任何东西

标签: python postgresql docker sqlalchemy


【解决方案1】:

不确定这是否只是您的示例中的错字,但您将第一个代码 sn-p 中的 postgres 容器映射到端口 5430。如果这是正确的,您必须将连接字符串更改为以下内容:

engine = create_engine('postgresql+psycopg2://postgres:mysecretpassword@localhost/mydb?port=5430') ### IMPORTANT!!!

【讨论】:

  • 与“服务器是否在主机“localhost”(127.0.0.1) 上运行并接受端口 5432 上的 TCP/IP 连接?”中的错误相同或“服务器是否在主机“localhost”(127.0.0.1)上运行并接受端口 5430 上的 TCP/IP 连接?”
  • 这是一个错字,我把它改成了 5430,仍然是同样的错误。"" 服务器是否在主机 "localhost" (127.0.0.1) 上运行并接受端口 5430 上的 TCP/IP 连接" "
【解决方案2】:

我终于弄清楚了这个问题。它是“localhost”,127.0.0.1 上没有运行任何东西。

我不得不将其更改为 docker 机器的 IP。如果您打开 Docker 快速入门终端,则会显示此信息。它显示类似“docker is configured to use the default machine with IP 192.168.XX.XXX”

另一种查找此 IP 的方法是打开 Resource Monitor,转到 Network 选项卡,然后检查 TCP 连接。应该有docker.exe 正在运行。远程地址 列中显示的 IP 是可以使用的。

终于找到正确的命令了:

engine = create_engine('postgresql+psycopg2://postgres:mysecretpassword@192.168.XX.XXX/mydb?port=5430')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2019-11-11
    • 2023-04-02
    • 2021-02-11
    • 2017-04-06
    • 2011-07-08
    相关资源
    最近更新 更多