Подключение PostgreSQL к Django-проекту
- Просмотры: 52
- Категория: Администрирование
- Создано: 27 августа 2024
- Тэги:
Для подключения СУБД PostgreSQL с Django- проекту используется модуль Psycopg. Недавно вышла его третья версия и её можно, и даже нужно, использовать в своих Django-проектах. Но для этого Django должен быть версии 4.2+.
Итак, если надо, обновляем Django до этой, или более свежей, версии.
pip install --upgrade Django==4.2.15
Теперь устанавливаем psycopg
pip install --upgrade psycopg[c]
Для того, чтобы pip сконфигурировал и скомпилировал этот модуль, ему необходима утилита pg_config. Если она не находится, то нужно добавить путь к ней и опять запустить указанную команду.
Если pip ругается, что не может найти заголовочный файл pg_config.h, значит нужно поставить devel-пакет для PostgreSQL сервера. На Ubuntu его можно найти в списке, который выведет команда
apt search postgresql devel
Когда всё прошло успешно, можем старый psycopg2 удалить
pip uninstall psycopg2
и перезапустить UWSGI или Gunicorn, смотря на чём работает ваш Django-проект:sudo systemctl restart emperor.uwsgi
Теперь ваш Django-проект работает (если работает) на новом драйвере psycopg. Если не работает, ищем причину или, в крайнем случае, возвращаемся на depricated версию psycopg2.
Теперь займемся настройкой подключения Django-проекта к базе данных. Раньше в файл settings.py вносили такие данные:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', 'HOST': '127.0.0.1', 'PORT': '5432', } }
В новой документации Django говорят, что подключаться надо так:
DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", "OPTIONS": { "service": "my_service", "passfile": ".my_pgpass", }, } }
Сначала создадим файл для сервисов, где укажем наш my_service. Сначала пытаемся выяснить, где PostgreSQL ищет файлы с прописанными там сервисами. Они находятся либо в домашней директории пользователя в ~/.pg_service.conf, либо в глобальном файле pg_service.conf. Но положить его нужно в правильную директорию. Найти эту директорию несложно. Вызываем
pd_config --sysconfdir
и в указанной директорию (это может быть /etc, либо /usr/local/etc, либо /etc/postgresql-common, либо что-то еще) создаём файл pg_service.conf с таким содержанием[my_service] host=localhost user=USER dbname=NAME port=5432
Вместо my_service указываем то имя, которое мы прописали в settings.py. Понятно, что USER — это имя пользователя, подключающегося к БД, а NAME — имя базы данных нашего проекта.
Теперь создадим файл с паролем, для подключения к БД. Пусть наш проект на сервере живёт в директории /var/www/myproject. Переходим туда
cd /var/www/myproject
Здесь создаём файл .my_pgpass
nano .my_pgpass
В него помещаем данные о подключении к БД
localhost:5432:NAME:USER:PASSWORD
Здесь NAME — имя базы данных, USER — имя пользователя, подключающегося к ней, PASSWORD — пароль для подключения. Наш файл settings.py должен теперь выглядеть так:
DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", "OPTIONS": { "service": "my_service", "passfile": "/var/www/myproject/.my_pgpass", }, } }
Остались последние штрихи. Первое, меняем права доступа к парольному файлу:
chmod 0600 /var/www/myproject/.my_pgpass
Кроме того, необходимо установить правильного владельца этого файла. Чаще всего Django-проекты запускаются от имени пользователя www-data. Если это не так, ищем имя этого пользователя в настройках UWSGI или Gunicorn. Меняем владельца
sudo chown www-data:www-data /var/www/myproject/.my_pgpass
И перезапускаем проект
sudo systemctl restart emperor.uwsgi
Если все было сделано правильно, Django-проект запуститься с новыми настройками. Если что-то пошло не так и получаем 500-ю ошибку сервера, включаем Debug и пытаемся найти ошибки.
В результате наших действий мы получим работающий на последней третьей версии Psycopg с настройками для подключения с помощью сервисного и парольного файлов.