Невозможно подключиться к Postgres из Django с помощью файла службы подключения (на Windows)

Я успешно настроил Django и Postgres, и я могу заставить их работать вместе, когда я помещаю все параметры Postgres в файл Django settings.py. Однако, как показано в документации Django, я хочу использовать вместо этого служебный файл подключения Postgres. Я создал файл службы (C:\Program Files\PostgreSQL\14\etc\pg_service.conf), который выглядит следующим образом:

[test_svc_1]
host=localhost
user=django_admin
dbname=MyDbName
port=5432

Запуск Postgres из командной строки с этим файлом, похоже, работает нормально, так как запрашивает пароль:

> psql service=test_svc_1
Password for user django_admin:

Однако, когда я пытаюсь сделать миграции с помощью Django, я получаю следующую ошибку:

Traceback (most recent call last):
File "C:\...\django\db\backends\base\base.py", line 219, in ensure_connection
   self.connect()
File "C:\...\django\utils\asyncio.py", line 26, in inner
   return func(*args, **kwargs)
File "C:\...\django\db\backends\base\base.py", line 200, in connect
   self.connection = self.get_new_connection(conn_params)
File "C:\...\django\utils\asyncio.py", line 26, in inner
   return func(*args, **kwargs)
File "C:\...\django\db\backends\postgresql\base.py", line 187, in get_new_connection
   connection = Database.connect(**conn_params)
File "C:\Users\...\psycopg2\__init__.py",line 122, in connect
   conn = _connect(dsn, connection_factory=connection_factory, **kwasync) 
psycopg2.OperationalError: definition of service "test_svc_1" not found

Были и другие исключения, связанные с этим, такие как:

django.db.utils.OperationalError: definition of service "test_svc_1" not found

но все они указывали на то, что служба "test_svc_1" не найдена.

Вот выдержка из моего файла Django settings.py. Добавление параметра NAME продвинуло меня немного дальше, но мне не нужно включать его, как только Django(?) найдет файл службы соединения.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': 'localhost',
        'NAME': 'MyDbName',
        'OPTIONS': {
            'service': 'test_svc_1',
            'passfile': '.my_pgpass',
        },
    },
}

Есть мысли о том, чего мне не хватает? В худшем случае, я думаю, я могу вернуться к использованию переменных окружения и заставить файл settings.py ссылаться на них. Но я хотел бы понять, что я делаю неправильно, а не сдаваться.

Спасибо за любое руководство.

Если кто-нибудь столкнется с этим вопросом, я наконец-то заставил его работать с файлами сервисов и паролей благодаря некоторым указаниям Кена Уайтселла на форуме Django. Вот что мне нужно было сделать:

Мне пришлось создать переменные окружения Windows для PGPASSFILE и PSERVICEFILE, которые указывают на эти два файла. Я поместил их оба в C:\Program Files\PostgreSQL\14\etc, хотя я предполагаю, что они могут находиться в других каталогах, если переменные окружения указывают на них. Далее, мне пришлось изменить запись базы данных в файле settings.py Django следующим образом (что отличается от того, что указано в документации Django):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': 'localhost',
        'NAME': 'MyDbName',
        'OPTIONS': {
            'service': 'test_svc_1',
        },
    },
}

Имя службы в OPTIONS должно совпадать с именем службы в PGSERVICEFILE.

Два отличия от документации Django:

  • Мне нужно было включить имя базы данных.
  • Я не смог заставить его работать с записью 'passfile' в словаре OPTIONS, но он работает, когда я удаляю эту запись. Возможно, я делаю что-то не так, но я пробовал несколько разных вариантов и папок.

Оказалось, что имя сервиса в файле ~/.pg_service.conf должно быть именем базы данных, то есть: [djangodb] . После этого передавать DBNAME стало необязательно. А переменная окружения должна вызывать только имя сервиса, а не путь к файлу. В Django 4 у меня также были проблемы с поиском моих переменных окружения в файле settings.py с помощью os.environ.get('VAR'). После замены на str(os.getenv('VAR')) все стало гладко. Пока.

Используя Process Monitor, я обнаружил, что файл находится в %APPDATA%\Roaming\postgresql\.pg_service.conf. Размещение файла в этом месте не вызвало никаких проблем, и мне не пришлось устанавливать никаких системных переменных. В файле я указал хост, порт, пользователя и пароль, а в настройках django я указал только базу данных и сервис. Документация по postgresql, очевидно, не верна.

Вернуться на верх