Подключение PostgreSQL к приложению Django
Добавление базы данных в ваше приложение обеспечивает целостность и безопасность данных. PostgreSQL (Postgres) — это реляционная СУБД, совместимая с большинством операционных систем и популярных языков программирования. Postgres поддерживает различные типы данных и документы, а также сложные возможности (например, транзакции, индексы, JSONB).
В этом руководстве вы узнаете, как установить, настроить и использовать PostgreSQL в приложении на Django. Мы пройдём весь путь: установка, создание базы, подключение через psycopg2, миграции, тестирование CRUD (создание, чтение, обновление, удаление) и базовая эксплуатация в продакшен-сценариях.
Содержание
- Установка PostgreSQL на систему
- Создание базы данных и базовые команды psql
- Структура PostgreSQL вкратце
- Установка Django и psycopg2
- Создание проекта и приложения Django
- Подключение базы к проекту
- Миграции и проверка
- Тестирование CRUD в Django shell
- Почему выбирать PostgreSQL
- Альтернативы и ситуации, когда Postgres — не лучший выбор
- Практические чек-листы, безопасность и резервное копирование
- Критерии приёмки и тест-кейсы
- Короткое объявление для команды
1. Установка PostgreSQL на Ubuntu
Ниже приведены инструкции для Ubuntu. Если вы используете Windows или macOS, следуйте официальной документации PostgreSQL для вашей ОС.
Сначала обновите индексы пакетов:
$ sudo apt-get updateУстановите PostgreSQL и сопутствующие пакеты:
$ sudo apt-get install postgresql postgresql-contrib libpq-devПри подтверждении установки введите Y.
Подключитесь к системному пользователю postgres:
$ sudo -i -u postgresПроверьте установленную версию клиента psql:
postgres@nameofaccount:~$ psql --versionВыход может выглядеть так:
psql (PostgreSQL) 14.5 (Ubuntu 14.5-0ubuntu0.22.04.1)Выйдите из учётной записи postgres:
postgres@nameofaccount:~$ exitВажно: для продакшена используйте пакетный менеджер вашей ОС или официальные репозитории PostgreSQL — они дают более свежие сборки.
2. Создание базы данных
Перейдите в оболочку Postgres и создайте базу данных, которую вы будете использовать в Django-проекте:
$ sudo -i -u postgres
$ psql
postgres=# create database new_db;
postgres=# \lПри успешном создании сервер вернёт CREATE DATABASE. Команда \l перечисляет базы данных.
Структура PostgreSQL
Postgres — реляционная СУБД: данные хранятся в таблицах (tables). Таблица состоит из столбцов (columns) и строк (rows). У каждой строки обычно есть первичный ключ (primary key) — уникальный идентификатор. Внешние ключи (foreign key) связывают таблицы между собой и определяют отношения.
Понимание модели данных приложения (сущности, связи, ограничения) важно до проектирования таблиц и индексов.
3. Установка Django и библиотеки psycopg2
Для связи Django и PostgreSQL нужен адаптер libpq — в Python это пакет psycopg2.
Рекомендация: для разработки можно использовать psycopg2-binary (простая установка), для продакшена — psycopg2 (компиляция с системным libpq). Пример установки через pipenv:
$ pipenv install psycopg2-binary DjangoИли, если вы предпочитаете psycopg2 (prod):
$ pipenv install psycopg2 DjangoПримечание: на некоторых системах перед установкой psycopg2 требуется libpq-dev и python-dev-пакеты (установлены командой apt-get install libpq-dev python3-dev).
4. Создание проекта и приложения Django
Создадим проект и приложение. Например, создайте папку и инициализируйте проект:
$ mkdir Boma-watch
$ cd Boma-watch
$ django-admin startproject myboma .Обратите внимание на точку в конце: она создаёт проект в текущей папке.
Создайте приложение boma (в корне проекта) командой:
$ python manage.py startapp bomaЕсли вы не работали с Django раньше, начните с официального руководства по Django.
5. Подключение базы к проекту
Шаг 1: Измените настройки проекта для Postgres
Откройте myboma/settings.py и замените секцию DATABASES на конфигурацию Postgres. Пример безопасной конфигурации (рекомендуется хранить секреты в переменных окружения):
import os
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.getenv('DB_NAME', 'new_db'),
'USER': os.getenv('DB_USER', 'morine'),
'PASSWORD': os.getenv('DB_PASSWORD', 'password'),
'HOST': os.getenv('DB_HOST', 'localhost'),
'PORT': os.getenv('DB_PORT', '5432'),
}
}Замените DB_USER и DB_PASSWORD на реальные учётные данные. Храните пароли в защищённых переменных окружения или менеджере секретов.
Важно: в продуктивной среде не храните пароли в settings.py в виде явного текста.
Шаг 2: Обновите часовой пояс
В settings.py укажите строковое значение TIME_ZONE:
TIME_ZONE = 'Africa/Nairobi'Django по умолчанию использует UTC; укажите ваш часовой пояс при необходимости.
Шаг 3: Создайте модель
В приложении boma в файле models.py создайте модель Profile:
from django.db import models
class Profile(models.Model):
name = models.CharField(max_length=30)
bio = models.TextField(max_length=100)
def __str__(self):
return self.nameШаг 4: Выполните миграции
Сначала создайте миграции для приложения, затем примените их:
(virtual)$ python manage.py makemigrations boma
(virtual)$ python manage.py migrateПосле успешной миграции вы увидите, что таблицы созданы.
Команда migrate просматривает INSTALLED_APPS и запускает SQL для создания таблиц, индексов и ограничений.
6. Тестирование CRUD в проекте
Откройте Django shell:
(virtual)$ python manage.py shellСоздание (Create)
from boma.models import Profile
prof1 = Profile.objects.create(name='Ken', bio='I am a Scorpio')
prof1.save()Чтение (Read)
Profile.objects.all() # -> QuerySet с объектами
Profile.objects.get(pk=1) # -> один объект по первичному ключуОбновление (Update)
Profile.objects.filter(id=1).update(name='Kim') # вернёт число обновлённых строк
Profile.objects.filter(id=1) # проверьте измененияУдаление (Delete)
Profile.objects.filter(id=1).delete() # вернёт кортеж (число, подробности)
Profile.objects.filter(id=1) # пустой QuerySetКритерии приёмки
- Модель Profile создаётся и отображается в админке (если включена).
- Созданные объекты сохраняются в Postgres и доступны через ORM.
- Миграции применяются без ошибок.
Почему выбирать PostgreSQL
Postgres — зрелая, расширяемая и надёжная СУБД. Причины выбора:
- Совместимость с большинством языков и ОС.
- Поддержка расширенных типов (JSONB, ARRAY, UUID, GEOMETRY через PostGIS).
- Богатые возможности индексации и оптимизации запросов.
- Активное сообщество и постоянные улучшения (open-source).
Когда Postgres может быть избыточен: очень маленькие проекты или одиночные сценарии разработки, где SQLite проще в настройке; для горизонтально масштабируемых распределённых транзакций можно рассмотреть NewSQL/распределённые СУБД.
Альтернативы и когда они лучше
- SQLite: для простых локальных или тестовых приложений.
- MySQL / MariaDB: если инфраструктура уже стандартизирована на них.
- Управляемые СУБД (AWS RDS, Google Cloud SQL, Azure Database): когда вы хотите снять с себя операционную нагрузку.
- CockroachDB, Yugabyte: для распределённых транзакций и автоматического шардинга.
Практические советы по безопасности и эксплуатации
Важно: не оставляйте базу открытой в сети.
- Ограничьте доступ в pg_hba.conf: разрешайте подключения только с доверенных хостов.
- Включите SSL/TLS для клиентских подключений (включая Django DATABASES OPTIONS с sslmode=’require’).
- Используйте надёжные пароли или аутентификацию через сертификаты и IAM в облаке.
- Регулярно обновляйте PostgreSQL и OS-пакеты.
- Настройте бэкапы: pg_dump и pg_basebackup для полных снимков.
- Шифруйте диски на уровне ОС или используйте встроенное шифрование в облаке.
Пример резервного копирования и восстановления (логическое):
$ pg_dump -U postgres -h localhost -Fc new_db > new_db.dump
$ pg_restore -U postgres -h localhost -d restored_db new_db.dumpМиграции и CI/CD рекомендации
- Миграции должны быть версионированы и запускаться в CI перед релизом.
- Тестовая база должна быть отдельной и воспроизводимой.
- В продакшене перед применением миграций сделайте резервную копию; для крупных таблиц планируйте миграции с минимальным простоя.
Мини-методология миграции
- Подготовьте миграции в ветке фичи.
- Прогоните миграции на staging с теми же настройками базы.
- Выполните резервную копию продакшена.
- Примените миграции и проверочные запросы.
Тест-кейсы и критерии приёмки
- Создать профиль через ORM и проверить присутствие в базе.
- Обновить поле name и убедиться, что изменилось в базе.
- Удалить запись и убедиться, что она отсутствует.
- Проверить, что миграции не меняют данные непреднамеренно.
Примеры тестов для автоматизации в Django (pytest или unittest) должны покрывать CRUD и миграции.
Чек-листы по ролям
Dev:
- Добавил модель и миграции.
- Написал unit-тесты CRUD.
- Не хардкодит секреты в settings.py.
DevOps/Инженер:
- Настроил SSL для Postgres.
- Добавил автоматические бэкапы и мониторинг.
- Ограничил доступ по сети (firewall, pg_hba.conf).
DBA:
- Настроил репликацию/точки восстановления.
- Планирует вакуумы и анализы (VACUUM, ANALYZE).
- Настроил политики резервного копирования и проверки целостности.
Decision flowchart (решение использовать Postgres)
flowchart TD
A[Нужна реляционная СУБД?] -->|Да| B{Требуются расширенные типы или индексы?}
A -->|Нет| Z[Используйте альтернативы 'NoSQL/SQLite']
B -->|Да| C[PostgreSQL]
B -->|Нет| D{Проще ли SQLite?}
D -->|Да| E[SQLite для локальной разработки]
D -->|Нет| C
C --> F[Рассмотрите управляемый Postgres в облаке]Совместимость, миграции и тонкие места
- При переносе с SQLite на Postgres проверяйте соответствие типов и уникальных ограничений.
- Для внешних ключей убедитесь, что данные консистентны.
- В больших таблицах изменение типа столбца может быть дорогой операцией — используйте поэтапные миграции.
Безопасность данных и соответствие требованиям персональных данных
Если вы храните персональные данные, следуйте принципам минимизации и псевдонимизации. Настройте ротацию ключей и доступ по принципу наименьших привилегий. Для соответствия требованиям (например, GDPR) используйте политики хранения и удаления данных.
Когда Postgres не подходит
- Очень мелкие однофайловые проекты: SQLite проще.
- Жёсткие требования к линейной масштабируемости запись/чтение на глобально распределённой системе: рассмотрите распределённые СУБД.
Короткое объявление для команды (100–200 слов)
Мы подключили PostgreSQL к проекту Django (myboma). База new_db создана на локальном сервере, настроен адаптер psycopg2, миграции применены, проверены CRUD-операции. Пароли не хардкодятся — используются переменные окружения. Планы: настроить резервное копирование с pg_dump, включить SSL и ограничить доступ на уровне сети. Разработчики: добавляйте тесты для моделей и используйте локальную копию базы при тестировании. DevOps: подготовить скрипты автоматических бэкапов и мониторинга.
Итог
- Вы установили Postgres, создали базу и подключили её к Django через psycopg2.
- Выполнили миграции и протестировали CRUD-операции.
- Получили рекомендации по безопасности, бэкапам и продакшен-операциям.
Важно: перед развёртыванием в продакшен обязательно протестируйте миграции на staging и настройте резервное копирование.
Ключевые ссылки и команды сохраните в README проекта и в скриптах автоматизации.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone