В чем разница между PostgreSQL и SQLite?
Что проверяют
Понимаете ли вы, что это СУБД разных классов, а не «большая и маленькая» версии одного и того же. Следом обычно спрашивают, почему проект не стоит тестировать на SQLite, если в проде PostgreSQL, или когда SQLite в проде вполне уместна.
Как отвечать
Начните с архитектуры, из неё следует всё остальное:
- SQLite: встраиваемая библиотека, база это один файл, отдельного сервера нет. В Python доступна из коробки через модуль
sqlite3, Django создаёт её в новом проекте по умолчанию; - PostgreSQL: клиент-серверная СУБД. Приложение подключается по сети через драйвер (
psycopg,asyncpg), есть роли, права, репликация, пул соединений.
Главное практическое отличие в конкурентной записи. В SQLite в каждый момент пишет только одно соединение: режим WAL позволяет читать параллельно с записью, но второй писатель ждёт блокировку и по таймауту получает database is locked. PostgreSQL за счёт MVCC и блокировок на уровне строк держит много одновременных писателей.
Дальше типы и возможности. SQLite использует динамическую типизацию: в колонку INTEGER можно положить строку, строгая проверка есть только в таблицах STRICT. PostgreSQL строго типизирован и богаче: JSONB с индексами, массивы, диапазоны, расширения вроде PostGIS и pgvector. При этом SQLite давно не примитивная: оконные функции, CTE, триггеры, JSON-функции и полнотекстовый поиск FTS5 в ней есть. Хранимых процедур нет.
Итог выбора: SQLite для локальных данных, CLI-утилит, десктопа, мобильных приложений и сайтов с редкой записью. PostgreSQL для веб-сервиса с несколькими воркерами, где пишут одновременно.
Где спотыкаются
Говорят, что SQLite «не поддерживает индексы и транзакции». Поддерживает, и транзакции там полноценные ACID.
Гоняют тесты на SQLite при PostgreSQL в проде. Поведение расходится: LIKE в SQLite нечувствителен к регистру для латиницы, типы не проверяются, часть синтаксиса отличается. Для тестов лучше тот же PostgreSQL в Docker или через Testcontainers.
Ставят SQLite под Gunicorn с несколькими воркерами и удивляются ошибкам блокировки, как только растёт запись.