Подключение к postgresql через python - PullRequest
0 голосов
/ 11 апреля 2020

В рамках более крупного проекта я пытаюсь автоматизировать создание базы данных и пользователя PostgreSQL, а также назначить им роль в Ubuntu. Я выяснил, как создать базу данных, и что psycopg2 - это то, что я хочу связать с ней, и проблема в том, что я не могу найти способ подключиться к базе данных. Если я использую команды

sudo -u postgres bash
psql testBase

, я могу получить доступ к базе данных и установить правило вручную. и из того, что я могу сказать, нет пароля по умолчанию для пользователя postgres, он использует другой тип аутентификации

os.system("sudo -H -u postgres bash -c 'createuser -DRS test2'")
os.system("sudo -H -u postgres bash -c 'createdb -O test2 testBase'")
conn = psycopg2.connect(database="testBase", user="test2", host="127.0.0.1")

создает базу данных и пользователя, но затем я получаю результат

Traceback (most recent call last):
  File "test2.py", line 7, in <module>
    conn = psycopg2.connect(database="testBase", user="test2", host="127.0.0.1")
  File "/home/openvas/.local/lib/python3.6/site-packages/psycopg2/__init__.py", line 127, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: fe_sendauth: no password supplied

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Postgresql обеспечивает беспарольные соединения через Unix доменный сокет. Чтобы получить такое поведение с помощью psycopg2, пропустите аргумент host в вызове конструктора соединений.

conn = psycopg2.connect(database="testBase", user="test2")

Если вы хотите использовать соединение, защищенное паролем, который вам понадобится чтобы отредактировать файл pg_hba.conf, добавив строку, подобную этой (выберите для IPv4 / IPv6):

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# IPv4 local connections:
host    testBase        test2             127.0.0.1/32            md5
# IPv6 local connections:
host    testBase        test2             ::1/128                 md5

Файл pg_hba.conf содержит описания каждого столбца.

Если вы хотите Чтобы подключиться с другого хоста, вам нужно установить

listen_addresses = '*'

в файле postgresql.conf (и внести необходимые изменения в брандмауэр).

Перезапустите / перезагрузите службу postgresql после изменения файлов конфигурации.

Как указывает комментарий jjanes, кажется, pg_hba.conf уже настроен для аутентификации по паролю, поэтому вам нужно решить, следует ли подключиться без пароля через unix сокет или используя комбинацию пользователь / пароль через tcp / ip.

0 голосов
/ 11 апреля 2020

Я бы предложил следующий сценарий:

  1. Создание базы данных и роли вручную (одноразовое задание)
  2. Теперь используйте psql_dumpall для создания "шаблона" (одноразовое задание как хорошо)
  3. Во время ваших операций автоматизации замените создание базы данных загрузкой файла дампа (снова и снова с каждым новым экземпляром)

Поскольку psql_dumpall сбрасывает весь экземпляр БД, то после загрузки dump у вас есть роли для входа в систему. Просто добавьте изменение пароля в свой код, и оно должно быть равно go.

...