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

时间:2018-03-16 16:43:53

标签: postgresql docker sqlalchemy

我尝试使用SQLAlchemy与dockerSQL PostgreSQL服务器进行交互。类似的东西:

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

这给了我这个错误:

  

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

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

3 个答案:

答案 0 :(得分:1)

在Docker上将SQLAlchemy与PostgreSQL连接

大家好!让我尝试帮助您将Flask Web App连接到都在Docker上运行的PostgreSQL数据库。

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

首先,您应该已经安装了以下python模块:

  • SQLAlchemy
  • psycopg2

您应该使用 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

现在让我们看看我的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!!

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

答案 1 :(得分:0)

由于烧瓶应用程序和Postgres映像不在同一个Docker容器中,因此您无法通过localhost来访问数据库!

在数据库URL中的

中,将 localhost 替换为Postgres URL的卷名称,并将其替换为docker compose /

中的Postgres Volume的名称。
engine = create_engine('postgresql://user:user_password@{}:5432/database'.format('volume_name_of_postgres'))

kudos to this answer.

答案 2 :(得分:0)

我遇到了同样的问题。经过几次尝试,发现问题出在给sqlalchemy.create_engine()

连接URL字符串中

首先我和你一样:

db_URL = f"postgresql://{db_login}:{db_password}@localhost:5432/postgres"

修复了一个:

db_URL = f"postgresql+psycopg2://{db_login}:{db_password}@db:5432/postgres"

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

db:
    image: postgres:12.7-alpine
    container_name: db