psycopg2.OperationalError" - 我通过pgadmin连接没有问题,但通过psycopg2却不行

0 投票
1 回答
32 浏览
提问于 2025-04-14 17:04

这个容器是在Docker里运行的。我试了很多方法,但都没有用。可能是什么外部因素导致了问题吗?

services:
    db:
      container_name: "db"
      image: postgres:14.1-alpine
      restart: always
      environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
          - POSTGRES_DB=postgres
          - POSTGRES_PORT=5432
          - POSTGRES_HOST=db
          - POSTGRES_HOST_AUTH_METHOD=trust
          - PGDATA=/var/lib/postgresql/data/pgdata
      ports:
          - "5432:5432"
      networks:
          - custom
db_name = 'postgres'
db_user = 'postgres'
db_password = 'postgres'
db_host = 'db'

conn =psycopg2.connect(dbname=db_name, user=db_user, password=db_password, host=db_host)

我已经尝试过了

import psycopg2

# Параметры подключения к базе данных PostgreSQL
db_name = 'postgres'
db_user = 'postgres'
db_password = 'postgres'
db_host = 'db'

conn =psycopg2.connect(dbname=db_name, user=db_user, password=db_password, host=db_host)

# Создание курсора для выполнения SQL запросов
cursor = conn.cursor()

# Пример выполнения запроса SELECT
cursor.execute("SELECT * FROM users")

# Получение результатов запроса
rows = cursor.fetchall()

# Вывод результатов
for row in rows:
    print(row)

# Закрытие курсора и соединения
cursor.close()
conn.close()

结果

Traceback (most recent call last):
  File "c:\Мои проекты\pythonProject\db\conect.py", line 48, in <module>
    conn =psycopg2.connect(dbname=db_name, user=db_user, password=db_password, host=db_host)
  File "C:\Мои проекты\pythonProject\.venv\lib\site-packages\psycopg2\__init__.py", line 122, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)       
psycopg2.OperationalError

没有延迟,这真让人烦恼。我会非常感激。

1 个回答

0

正如其他人所说的,db 这个名字只能在容器之间通信时使用,并且应该这样用,因为在你的主机上是看不到这个容器的主机名的。

相反,当你从主机连接到数据库容器时,你应该使用 localhost。这就是为什么需要 ports 部分的原因,你需要把端口 5432 发布出去,让主机可以访问。这个做法是很常见的。

更好的做法是使用 "127.0.0.1:5432:5432",这样就真的只把它发布到本地主机上。目前它是对外开放的,也就是说其他机器也能访问。

撰写回答