【问题标题】:How do I access postgresql within Docker with sqlalchemy?如何使用 sqlalchemy 在 Docker 中访问 postgresql?
【发布时间】:2023-03-10 15:10:01
【问题描述】:

我正在尝试使用 SQLAlchemy 与 dockerized 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 中,但没有成功。有小费吗?

【问题讨论】:

    标签: postgresql docker sqlalchemy


    【解决方案1】:

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

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

    engine = create_engine('postgresql://user:user_password@{}:5432/database'.format('service_name_of_postgres'))
    

    kudos to this answer.

    【讨论】:

      【解决方案2】:

      在 Docker 上连接 SQLAlchemy 和 PostgreSQL

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

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

      首先你应该已经安装了这些 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!!
      

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

      【讨论】:

        【解决方案3】:

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

        connection 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
        

        【讨论】:

          猜你喜欢
          • 2021-11-04
          • 2020-01-21
          • 2022-01-23
          • 2015-05-04
          • 1970-01-01
          • 2012-12-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多