Установка базы данных PostgreSQL
Почему PostgreSQL
SQLite отлично подходит для разработки: база — один файл, ничего не нужно устанавливать. Но для продакшена у него ограничения: одновременно писать может только один процесс, нет полнотекстового поиска, проблемы с регистронезависимым поиском по кириллице.
PostgreSQL — мощная бесплатная СУБД, которую Django поддерживает лучше всех. В django.contrib.postgres есть специальные поля (ArrayField, HStoreField), полнотекстовый поиск, поиск по сходству — всё это мы используем в следующем уроке.
Установка
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install postgresql postgresql-contrib
macOS
brew install postgresql@16
brew services start postgresql@16
Windows
Скачайте установщик с postgresql.org. Запомните пароль пользователя postgres, который зададите при установке.
Docker (любая ОС)
docker run --name blog-db -e POSTGRES_USER=blog -e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=blog -p 5432:5432 -d postgres:16
Одна команда — и база с пользователем готовы.
Пользователь и база
Подключаемся к PostgreSQL от имени администратора:
sudo -u postgres psql # Linux
psql -U postgres # macOS / Windows
CREATE USER blog WITH PASSWORD 'secret';
CREATE DATABASE blog OWNER blog ENCODING 'UTF8';
\q
Для каждого проекта — свой пользователь и своя база с минимальными правами.
Драйвер
pip install "psycopg[binary]"
pip freeze > requirements.txt
Настройки Django
Перед переключением сохраним данные из SQLite:
python manage.py dumpdata --exclude auth.permission --exclude contenttypes --indent 2 > mysite_data.json
Права и типы контента исключаем: Django создаст их заново при миграции, а дубликаты вызвали бы ошибку.
Теперь mysite/settings.py:
import os
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.environ.get("DB_NAME", "blog"),
"USER": os.environ.get("DB_USER", "blog"),
"PASSWORD": os.environ.get("DB_PASSWORD"),
"HOST": os.environ.get("DB_HOST", "localhost"),
"PORT": os.environ.get("DB_PORT", "5432"),
}
}
Пароль берём из переменной окружения:
export DB_PASSWORD=secret # Linux / macOS
set DB_PASSWORD=secret # Windows cmd
$env:DB_PASSWORD="secret" # PowerShell
Или используйте файл .env и python-decouple — как в уроке про почту.
Миграции и загрузка данных
python manage.py migrate
python manage.py loaddata mysite_data.json
Запустите сервер — блог работает на PostgreSQL, все посты, комментарии и пользователи на месте.
Если loaddata ругается
Самые частые причины: забыли исключить contenttypes при dumpdata, или в JSON попали данные приложений, которые не установлены. Можно выгружать только нужные приложения: dumpdata blog auth.user taggit.
Полезные команды psql
| Команда | Что делает |
|---|---|
\l |
список баз |
\c blog |
подключиться к базе |
\dt |
список таблиц |
\d blog_post |
структура таблицы |
\q |
выход |
Подключиться к базе проекта через Django: python manage.py dbshell.
Итог
- PostgreSQL — стандарт для Django в продакшене.
- Создаём отдельного пользователя и базу, ставим драйвер
psycopg. DATABASES["default"]["ENGINE"] = "django.db.backends.postgresql", секреты — из окружения.- Перенос:
dumpdata→ смена БД →migrate→loaddata.
Практика решено 0 из 5
Какой пакет Python нужен Django для подключения к PostgreSQL? (имя для pip, современная версия)
Настройте DATABASES для PostgreSQL: движок django.db.backends.postgresql, база blog,
пользователь blog, пароль из переменной окружения DB_PASSWORD (через os.environ.get), хост localhost.
import os
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "blog",
"USER": "blog",
"PASSWORD": os.environ.get("DB_PASSWORD"),
"HOST": "localhost",
"PORT": "5432",
}
}
Расставьте шаги переноса данных из SQLite в PostgreSQL.
-
Переключить
DATABASESна PostgreSQL -
python manage.py loaddata data.json -
python manage.py dumpdata --exclude auth.permission --exclude contenttypes --indent 2 > data.json(на SQLite) -
python manage.py migrate— создать таблицы в PostgreSQL
Какие преимущества PostgreSQL перед SQLite важны для продакшена?
SQL-команда PostgreSQL для создания базы blog с владельцем blog (как в уроке). Напишите её.
CREATE DATABASE blog OWNER blog;Войдите, чтобы отмечать пройденные уроки.