如何使用 sqlalchemy 在 Docker 中访问 postgresql?

use*_*842 5 postgresql sqlalchemy docker

我正在尝试使用 SQLAlchemy 与 dockerized PostgreSQL 服务器进行交互。就像是:

engine = create_engine('postgresql://user:user_password@localhost:5432/database')
df.to_sql('table', engine)
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

OperationalError: (psycopg2.OperationalError) 无法连接到服务器:连接被拒绝 服务器是否在主机“localhost”(::1) 上运行并接受端口 5432 上的 TCP/IP 连接?无法连接到服务器:连接被拒绝 服务器是否在主机“localhost”(127.0.0.1) 上运行并接受端口 5432 上的 TCP/IP 连接?

这表明 Docker postgresql(正在运行)在该端口不可用。我试过添加-p 5432:5432到我的docker-compose exec没有成功。有小费吗?

Esp*_*azi 10

由于您的 Flask 应用程序和 Postgres 图像不在同一个 docker 容器中,因此您无法通过 localhost 访问数据库!

在数据库 URL 中将localhost替换为 docker-compose/ 中 Postgres 服务的名称

engine = create_engine('postgresql://user:user_password@{}:5432/database'.format('service_name_of_postgres'))
Run Code Online (Sandbox Code Playgroud)

感谢这个答案。


小智 10

在 Docker 上连接 SQLAlchemy 与 PostgreSQL

大家好!让我尝试帮助您将 Flask Web 应用程序连接到 PostgreSQL 数据库,两者都运行在 Docker 上。

请在尝试复制和粘贴代码之前阅读所有内容

首先你应该安装这些 python 模块:

  • SQL炼金术
  • 心理咨询师2

您应该使用pip安装它们。

psycopg2 是将 SQLAlchemy 连接到 PostgreSQL 数据库所需的 PostgreSQL 驱动程序之一。


我正在向您展示我的docker-compose.yml文件。

version: '3'
services:

  web:
     #YourWebServiceConfiguration
     #YourWebServiceConfiguration
     #YourWebServiceConfiguration

  db_postgres:
    image: postgres:latest
    container_name: postgres_db_container
    ports:
        - "5432:5432"
    volumes:
        - postgres_db_vol:/var/lib/postgresql/data

    environment:
        POSTGRES_USER: yourUserDBName
        POSTGRES_PASSWORD: yourUserDBPassword
        POSTGRES_DB: yourDBName
Run Code Online (Sandbox Code Playgroud)

现在让我们看看我的Python代码!这是一个test.py文件。

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker


conn_url = 'postgresql+psycopg2://yourUserDBName:yourUserDBPassword@yourDBDockerContainerName/yourDBName'

engine = create_engine(conn_url)

db = scoped_session(sessionmaker(bind=engine))


query_rows = db.execute("SELECT * FROM anyTableName").fetchall()
for register in query_rows:
    print(f"{register.col_1_name}, {register.col_2_name}, ..., {register.col_n_name}")
    # Note that this Python way of printing is available in Python3 or more!!
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多信息,可以查看以下链接。


ind*_*Ark 5

我有同样的问题。经过几次尝试后,问题出现在提供给sqlalchemy.create_engine()的连接 URL字符串中

首先我和你有类似的情况:

db_URL = f"postgresql://{db_login}:{db_password}@localhost:5432/postgres"
Run Code Online (Sandbox Code Playgroud)

固定一:

db_URL = f"postgresql+psycopg2://{db_login}:{db_password}@db:5432/postgres"
Run Code Online (Sandbox Code Playgroud)

我这边同时进行两项更改的做法有点愚蠢,但我检查过,看起来问题出在localhost。将服务器地址更改为docker_compose.yml中指定的container_name应该可以解决连接问题。

db:
    image: postgres:12.7-alpine
    container_name: db
Run Code Online (Sandbox Code Playgroud)