| Параметр | Sqlite | Postgresql |
|---|---|---|
| Модель развёртывания | Встраиваемая библиотека внутри процесса приложения, без сервера | Клиент-серверная СУБД, отдельный процесс и сетевой демон |
| Хранение данных | Один файл на диске (весь БД в .db/.sqlite) | Каталог данных с множеством файлов, управляется сервером |
| Конкурентная запись | Ограниченно: один writer одновременно, блокировка на уровне БД (WAL смягчает) | Да: MVCC, много одновременных writer-ов без глобальной блокировки |
| Транзакции и ACID | Да, полноценный ACID через журнал/WAL | Да, полноценный ACID через MVCC и WAL |
| Типизация колонок | Динамическая (type affinity), можно писать текст в INTEGER-колонку | Строгая статическая типизация, ошибка при несовпадении типа |
| Типы данных | Базовые: INTEGER, REAL, TEXT, BLOB, NUMERIC | Богатый набор: JSONB, ARRAY, UUID, ENUM, geometric, range, tsvector |
| Оконные функции и CTE | Да (window functions с 3.25, рекурсивные CTE) | Да, полная поддержка, включая RANGE/GROUPS frame и продвинутые агрегаты |
| Масштаб данных | Комфортно до единиц ГБ, один узел, одна машина | Терабайты, партиционирование, репликация, шардинг через расширения |
| Расширяемость | Ограниченная: часть extension (FTS5, JSON1, R-Tree) | Высокая: PostGIS, pg_stat_statements, foreign data wrappers, свои типы и функции |
| Учётные записи и права | Нет ролей и GRANT, доступ = права на файл | Роли, GRANT/REVOKE, row-level security |
| Стоимость и запуск | Бесплатно (public domain), zero-config, ничего ставить не надо | Бесплатно (open source), нужен установленный и настроенный сервер |
SQLite допускает только одного writer одновременно — на время записи база блокируется (режим WAL это смягчает, но не снимает ограничение полностью). При десятках параллельных INSERT/UPDATE запросы выстраиваются в очередь и упираются в блокировку. PostgreSQL использует MVCC, поэтому много транзакций пишут параллельно, не мешая друг другу и не блокируя читателей.
ACID — это Atomicity, Consistency, Isolation, Durability: транзакция либо применяется целиком, либо откатывается, данные остаются согласованными, параллельные транзакции изолированы, а зафиксированные изменения переживают сбой. SQLite обеспечивает ACID через rollback-журнал или WAL. PostgreSQL — через MVCC и WAL, при этом изоляция настраивается уровнями вплоть до SERIALIZABLE.
В SQLite типизация динамическая (type affinity): в колонку INTEGER можно записать текст, движок не выдаст ошибку. В PostgreSQL типизация строгая — несовпадение типа приводит к ошибке. Это важно, потому что скрытые несоответствия типов в SQLite ловятся поздно и портят агрегаты, а строгая типизация PostgreSQL ловит их сразу при вставке.
Базовый SQL (SELECT, JOIN, GROUP BY, оконные функции, CTE) почти одинаков, но есть различия: работа с датами (strftime/julianday в SQLite против date_trunc/интервалов в Postgres), автоинкремент (AUTOINCREMENT против SERIAL/GENERATED), приведение типов и функции строк. Перенос обычно требует правки этих мест. Отработать оба диалекта на живых задачах можно на /sql-sandbox, где движок поддерживает и SQLite, и PostgreSQL.
Postgresql vs Clickhouse · Pandas vs Polars · Tableau vs Powerbi Datalens Superset · SQL vs Pandas · Dbt vs Airflow · Redshift vs Bigquery vs Snowflake · Airflow vs Dagster vs Prefect · Greenplum vs Clickhouse · Excel vs SQL · Postgresql vs Mysql · Spark vs Pandas · Power Bi vs Excel · Clickhouse vs Druid · Python vs R