Подключение PostgreSQL к Django-проекту

Просмотры: 52
Категория: Администрирование
Создано: 27 августа 2024
Тэги: PostgreSQL Linux Python Ubuntu Django WSGI

Для подключения СУБД 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 с настройками для подключения с помощью сервисного и парольного файлов.