Задать вопрос
@Kungusto

Getaddrinfo failed: почему Python не может найти localhost?

При попытке подключения к PostgreSQL с использованием asyncpg возникает ошибка: socket.gaierror: [Errno 11001] getaddrinfo failed

Что важно:
1. Параметры подключения (user, password, db, host, port) — верные
2. PostgreSQL работает и доступен (в Docker-сети всё ок)
3. Подключение снаружи (например, из PowerShell или миграциями через Alembic) — вызывает ошибку
4. Файл hosts содержит оба нужных значения:
127.0.0.1 localhost
::1 localhost

Мои гипотезы
1. DNS или разрешение имён внутри Python/asyncpg
2. Возможно, getaddrinfo() не может получить IP по имени localhost даже с корректным hosts
3. Проблема может быть связана с конфигурацией самой системы или Python 3.12
4. Баг в Windows DNS-стеке или антивирус/фаервол

Как можно исправить ситуацию, когда localhost не резолвится корректно в asyncpg, несмотря на корректный hosts?
Какие есть способы заставить getaddrinfo() работать корректно в Windows + Python 3.12?
  • Вопрос задан
  • 133 просмотра
Подписаться 1 Средний 4 комментария
Пригласить эксперта
Ответы на вопрос 2
@Zerg89
PostgreSQL работает и доступен (в Docker-сети всё ок)

Если я правильно понял у вас postgres в докер контейнере
Тогда вам не на localhost надо подключатся а к ip контейнера или по днс имени контейнера
Localhost это внутренний адрес самой машины а вам надо подключится к виртуальной сети этой машины
Ответ написан
Комментировать
@baligins
Убедитесь, что в postgresql.conf разрешены подключения:
listen_addresses = 'localhost, 127.0.0.1'

Проверьте проброс портов в Docker
Убедитесь, что контейнер PostgreSQL запущен с пробросом порта
docker run -p 127.0.0.1:5432:5432 --name postgres -e POSTGRES_PASSWORD=password -d postgres

Если используется Docker Compose, добавьте в секцию сервиса:
- "127.0.0.1:5432:5432"

Если нет, попробуйте:
Используйте localhost:5432 в формате URI:
await asyncpg.connect("postgres://user:password@127.0.0.1:5432/db")
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы