Перейти до вмісту

SQLite

Матеріал з K2 ERP Wiki
Версія від 18:37, 14 травня 2026, створена R (обговорення | внесок) (Створена сторінка: {{SEO |title=SQLite — вбудована база даних, SQL, файлова БД, транзакції, індекси, ORM і ERP |description=SQLite: що це таке, як працює вбудована файлова база даних, таблиці, SQL-запити, транзакції, індекси, JOIN, обмеження, WAL, приклади для мобільних застосунків, ERP, CRM, Service Desk, K2 ERP, ан...)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)

SEO title: SQLite — вбудована база даних, SQL, файлова БД, транзакції, індекси, ORM і ERP SEO description: SQLite: що це таке, як працює вбудована файлова база даних, таблиці, SQL-запити, транзакції, індекси, JOIN, обмеження, WAL, приклади для мобільних застосунків, ERP, CRM, Service Desk, K2 ERP, аналітики, інтеграцій і міграції даних. SEO keywords: SQLite, база даних SQLite, SQL, файлова база даних, вбудована база даних, SQLite приклади, SQLite транзакції, SQLite індекси, SQLite WAL, ORM SQLite, ERP, K2 ERP Alternative to:


SQLite — це легка вбудована реляційна база даних, яка зберігає всі дані в одному файлі та не потребує окремого серверного процесу. SQLite часто використовують у мобільних застосунках, десктопних програмах, браузерах, IoT-пристроях, локальних кешах, тестових середовищах, невеликих сервісах, прототипах, аналітичних утилітах, міграційних інструментах і локальних модулях ERP.

На відміну від серверних СУБД, таких як PostgreSQL, MySQL або Microsoft SQL Server, SQLite працює як бібліотека всередині застосунку. Програма відкриває файл бази даних, виконує SQL-запити й сама керує доступом до цього файлу через SQLite.

У контексті K2 ERP, інтеграцій, міграції даних або локальних агентів SQLite може використовуватися як проміжне сховище: для тимчасового збереження вивантажених довідників, логів інтеграцій, контрольних сум, черг обміну, кешу API, локальних налаштувань, даних для тестування або невеликого автономного модуля.

Головне. SQLite — це база даних “в одному файлі”. Її легко підключити, легко перенести, легко зробити резервну копію, але вона не призначена для всіх сценаріїв великих багатокористувацьких ERP-систем.

Практичний приклад. Якщо потрібно зробити локальну утиліту для вивантаження даних з BAS, 1С або старої ERP, SQLite може зберігати проміжні таблиці: номенклатуру, контрагентів, договори, залишки, помилки імпорту й контрольні суми перед завантаженням у K2 ERP.

Важливо. SQLite добре підходить для локальних, вбудованих і помірних задач, але не варто використовувати її як основну базу великої ERP з багатьма одночасними користувачами, складними правами доступу, великими транзакціями та високим навантаженням на запис.

Що таке SQLite

SQLite — це реляційна база даних, яка дозволяє створювати таблиці, виконувати SQL-запити, зберігати записи, будувати індекси, використовувати транзакції, обмеження, JOIN, представлення й тригери.

Особливість SQLite у тому, що вона:

  • не потребує окремого сервера;
  • зберігає базу в одному файлі;
  • працює всередині застосунку;
  • підтримує SQL;
  • має транзакції;
  • проста для розгортання;
  • добре підходить для локальних даних;
  • часто використовується в мобільних і десктопних програмах.

Простий приклад SQLite

Є файл:

company.db

У ньому можна створити таблицю клієнтів:

CREATE TABLE customers (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT,
    phone TEXT
);

Додати клієнта:

INSERT INTO customers (name, email, phone)
VALUES ('ТОВ Клієнт Плюс', 'info@example.com', '+380XXXXXXXXX');

Отримати клієнтів:

SELECT id, name, email, phone
FROM customers;

Усе це зберігається не на окремому сервері, а у файлі company.db.

Для чого потрібна SQLite

SQLite потрібна там, де потрібна проста, надійна й локальна база даних без складного адміністрування.

Типові сценарії:

  • мобільні застосунки;
  • десктопні програми;
  • локальні налаштування;
  • кеш API;
  • офлайн-режим;
  • тестування;
  • прототипи;
  • невеликі внутрішні інструменти;
  • обробка CSV або Excel;
  • міграційні утиліти;
  • зберігання логів;
  • локальні черги;
  • embedded-системи;
  • IoT-пристрої;
  • навчальні приклади SQL.

SQLite як файлова база даних

SQLite зберігає всю базу в одному файлі.

Наприклад:

Файл Що містить Приклад використання
app.db Дані застосунку Десктопна програма
mobile.db Локальні дані телефона Мобільний застосунок
migration.db Проміжні дані міграції Перехід у K2 ERP
cache.db Кеш API Локальна синхронізація
logs.db Журнал подій Інтеграційний агент

Файл можна скопіювати, архівувати, перенести на інший комп’ютер або підключити до іншої програми.

SQLite і серверні бази даних

SQLite відрізняється від серверних СУБД.

Ознака SQLite PostgreSQL / MySQL / SQL Server
Архітектура Вбудована бібліотека Окремий сервер
Зберігання Один файл Серверні файли й служби
Налаштування Мінімальне Потрібне адміністрування
Масштаб Локальні й помірні задачі Великі системи й багато користувачів
Одночасний запис Обмежений Краще підтримується
Типовий сценарій Мобільний застосунок, кеш, прототип ERP, CRM, великий вебсервіс

Коли SQLite підходить

SQLite добре підходить, якщо:

  • база локальна;
  • користувач один або їх небагато;
  • дані зберігаються на пристрої;
  • потрібен офлайн-режим;
  • потрібна проста установка;
  • потрібно швидко зробити прототип;
  • потрібно обробити файл даних;
  • потрібно зберегти кеш;
  • потрібна тестова база;
  • потрібне проміжне сховище для міграції.

Коли SQLite не підходить

SQLite не є найкращим вибором, якщо:

  • багато користувачів одночасно активно пишуть у базу;
  • потрібна велика серверна ERP;
  • потрібна складна система прав на рівні СУБД;
  • потрібна реплікація між серверами;
  • потрібне горизонтальне масштабування;
  • база має дуже велике навантаження на запис;
  • потрібні складні серверні процедури;
  • потрібна централізована корпоративна СУБД;
  • дані мають оброблятися багатьма сервісами одночасно.

Приклад: де SQLite доречна

Невелика утиліта для імпорту прайсу постачальника.

Вона робить:

  1. Завантажує Excel-файл.
  2. Зберігає дані у SQLite.
  3. Перевіряє артикулі.
  4. Шукає дублікати.
  5. Формує звіт помилок.
  6. Готує файл для ERP.

У цьому випадку SQLite зручна, бо не потрібно розгортати сервер бази даних.

Приклад: де SQLite недоречна

Компанія хоче запустити основну ERP для 300 користувачів:

  • продажі;
  • закупівлі;
  • склад;
  • виробництво;
  • фінанси;
  • зарплата;
  • банк;
  • каса;
  • Power BI;
  • API;
  • інтеграції;
  • аудит дій.

Для такого сценарію краще використовувати серверну СУБД, а SQLite залишити для локальних кешів, агентів або допоміжних інструментів.

Основні можливості SQLite

SQLite підтримує багато можливостей реляційних баз даних:

  • таблиці;
  • SQL-запити;
  • індекси;
  • первинні ключі;
  • зовнішні ключі;
  • транзакції;
  • представлення;
  • тригери;
  • JOIN;
  • агрегатні функції;
  • підзапити;
  • обмеження;
  • WAL-режим;
  • тимчасові таблиці;
  • вбудовані функції.

Таблиці SQLite

Таблиця зберігає дані у вигляді рядків і колонок.

Приклад таблиці товарів:

CREATE TABLE products (
    id INTEGER PRIMARY KEY,
    sku TEXT NOT NULL,
    name TEXT NOT NULL,
    unit TEXT NOT NULL,
    price REAL,
    active INTEGER DEFAULT 1
);

У такій таблиці можна зберігати номенклатуру:

id sku name unit price active
1 USB-C-1M-BLK Кабель USB-C 1 м чорний шт. 180.00 1
2 COFFEE-1KG Кава арабіка 1 кг кг 720.00 1

Типи даних у SQLite

SQLite має гнучку систему типів.

Основні типи:

  • INTEGER;
  • REAL;
  • TEXT;
  • BLOB;
  • NULL.

Приклади:

Тип Що зберігає Приклад
INTEGER Цілі числа 100
REAL Числа з дробовою частиною 1250.75
TEXT Текст ТОВ “Компанія”
BLOB Бінарні дані файл або зображення
NULL Відсутність значення порожнє поле

Первинний ключ

Первинний ключ ідентифікує кожен рядок таблиці.

Приклад:

CREATE TABLE orders (
    id INTEGER PRIMARY KEY,
    number TEXT NOT NULL,
    order_date TEXT NOT NULL
);

Поле id є унікальним і дозволяє точно знайти замовлення.

Зовнішній ключ

Зовнішній ключ зв’язує одну таблицю з іншою.

Наприклад, замовлення належить клієнту:

CREATE TABLE orders (
    id INTEGER PRIMARY KEY,
    customer_id INTEGER NOT NULL,
    number TEXT NOT NULL,
    order_date TEXT NOT NULL,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
);

Це означає, що customer_id у замовленні має відповідати існуючому клієнту.

Приклад зв’язку клієнтів і замовлень

Таблиця Поле Значення
customers id 15
customers name ТОВ “Клієнт Плюс”
orders customer_id 15
orders number ORD-000145

Завдяки зовнішньому ключу можна зрозуміти, якому клієнту належить замовлення.

SQL-запити в SQLite

SQLite підтримує стандартні SQL-операції.

Основні команди:

  • SELECT;
  • INSERT;
  • UPDATE;
  • DELETE;
  • CREATE TABLE;
  • ALTER TABLE;
  • DROP TABLE;
  • CREATE INDEX;
  • JOIN;
  • GROUP BY;
  • ORDER BY.

SELECT

SELECT використовується для читання даних.

Приклад:

SELECT id, name, email
FROM customers
WHERE active = 1
ORDER BY name;

Цей запит поверне активних клієнтів, відсортованих за назвою.

INSERT

INSERT додає новий запис.

Приклад:

INSERT INTO products (sku, name, unit, price)
VALUES ('USB-C-1M-BLK', 'Кабель USB-C 1 м чорний', 'шт.', 180.00);

UPDATE

UPDATE змінює існуючий запис.

Приклад:

UPDATE products
SET price = 190.00
WHERE sku = 'USB-C-1M-BLK';

DELETE

DELETE видаляє запис.

Приклад:

DELETE FROM products
WHERE id = 10;

У бізнес-системах часто краще не видаляти фізично, а використовувати ознаку активності:

UPDATE products
SET active = 0
WHERE id = 10;

JOIN у SQLite

JOIN дозволяє об’єднувати дані з кількох таблиць.

Приклад: отримати замовлення разом із клієнтами.

SELECT orders.number, orders.order_date, customers.name
FROM orders
JOIN customers ON customers.id = orders.customer_id;

Результат:

Номер замовлення Дата Клієнт
ORD-000145 2026-05-15 ТОВ “Клієнт Плюс”
ORD-000146 2026-05-16 ФОП Іваненко

GROUP BY

GROUP BY групує дані для підсумків.

Приклад: продажі по клієнтах.

SELECT customer_id, SUM(total_amount) AS total_sales
FROM orders
GROUP BY customer_id;

Це корисно для аналітики, звітів і контрольних сум.

ORDER BY

ORDER BY сортує результат.

Приклад:

SELECT name, price
FROM products
ORDER BY price DESC;

Поверне товари від найдорожчого до найдешевшого.

Індекси SQLite

Індекс прискорює пошук.

Приклад:

CREATE INDEX idx_products_sku
ON products (sku);

Після цього пошук товару за артикулом буде швидшим:

SELECT *
FROM products
WHERE sku = 'USB-C-1M-BLK';

Коли потрібні індекси

Індекси корисні для полів, за якими часто шукають або фільтрують:

  • артикул;
  • номер документа;
  • дата;
  • клієнт;
  • договір;
  • статус;
  • зовнішній ID;
  • склад;
  • організація;
  • email;
  • телефон.

Приклад індексів для інтеграції

Якщо сайт передає замовлення в локальну SQLite-базу, варто створити індекс по зовнішньому номеру:

CREATE UNIQUE INDEX idx_orders_external_id
ON orders (external_order_id);

Це допоможе не створити дублікат одного й того самого замовлення.

Обмеження SQLite

Обмеження допомагають зберігати якість даних.

Типові обмеження:

  • NOT NULL;
  • UNIQUE;
  • CHECK;
  • PRIMARY KEY;
  • FOREIGN KEY;
  • DEFAULT.

Приклад обмежень

CREATE TABLE payments (
    id INTEGER PRIMARY KEY,
    amount REAL NOT NULL CHECK (amount > 0),
    currency TEXT NOT NULL DEFAULT 'UAH',
    payment_date TEXT NOT NULL
);

Це означає:

  • сума обов’язкова;
  • сума має бути більшою за нуль;
  • валюта за замовчуванням UAH;
  • дата платежу обов’язкова.

UNIQUE

UNIQUE забороняє дублікати.

Приклад:

CREATE TABLE customers (
    id INTEGER PRIMARY KEY,
    edrpou TEXT UNIQUE,
    name TEXT NOT NULL
);

Це допомагає не створювати двох контрагентів з однаковим ЄДРПОУ.

CHECK

CHECK перевіряє значення.

Приклад:

CREATE TABLE order_lines (
    id INTEGER PRIMARY KEY,
    quantity REAL NOT NULL CHECK (quantity > 0),
    price REAL NOT NULL CHECK (price >= 0)
);

Так не вийде зберегти рядок замовлення з від’ємною кількістю.

Транзакції SQLite

Транзакція — це група операцій, які мають виконатися разом.

Приклад:

BEGIN TRANSACTION;

INSERT INTO payments (amount, currency, payment_date)
VALUES (80000, 'UAH', '2026-05-15');

UPDATE supplier_balances
SET balance = balance - 80000
WHERE supplier_id = 25;

COMMIT;

Якщо сталася помилка, можна виконати:

ROLLBACK;

Приклад транзакції в міграції

Під час міграції потрібно завантажити контрагента, договори й відкриті залишки.

Операції:

  1. Створити контрагента.
  2. Створити договори.
  3. Завантажити дебіторку.
  4. Завантажити кредиторку.
  5. Записати контрольну суму.

Якщо помилка сталася на третьому кроці, краще відкотити все, щоб не залишити неповний запис.

ACID у SQLite

SQLite підтримує принципи ACID.

Принцип Що означає Приклад
Atomicity Операція виконується повністю або не виконується Платіж не має бути наполовину проведений
Consistency Дані залишаються узгодженими Замовлення має існуючого клієнта
Isolation Транзакції не повинні ламати одна одну Паралельні операції не змішують дані
Durability Після COMMIT дані збережені Після запису дані не зникають

WAL-режим SQLite

WAL означає Write-Ahead Logging.

WAL-режим може покращити роботу при одночасному читанні й записі. У цьому режимі SQLite використовує додатковий журнал записів.

Увімкнути WAL можна так:

PRAGMA journal_mode=WAL;

WAL часто корисний, коли:

  • є кілька читачів;
  • є фоновий процес запису;
  • застосунок активно читає дані;
  • потрібна краща паралельність;
  • база використовується як локальний кеш.

SQLite і одночасний доступ

SQLite добре працює з багатьма читачами, але має обмеження для багатьох одночасних записів.

Типовий принцип:

  • читати можуть багато процесів;
  • запис одночасно обмежений;
  • довгі транзакції можуть блокувати інших;
  • часті масові записи потрібно планувати обережно.

Для великої багатокористувацької ERP це важливе обмеження.

SQLite і резервні копії

Оскільки SQLite — файлова база, резервну копію можна зробити копіюванням файлу.

Але краще робити копію тоді, коли:

  • база не використовується;
  • транзакції завершені;
  • використовується штатний механізм backup;
  • файл не копіюється під час активного запису.

Для важливих даних потрібно мати регулярні резервні копії.

Приклад резервної копії

Файли:

migration.db
migration.db-wal
migration.db-shm

Якщо увімкнений WAL, потрібно враховувати додаткові файли або правильно завершити транзакції перед копіюванням.

SQLite і міграції структури

Структуру SQLite-бази можна змінювати через SQL.

Приклад: додати поле статусу в замовлення.

ALTER TABLE orders
ADD COLUMN status TEXT DEFAULT 'new';

У застосунках краще вести міграції версіями:

Версія Зміна
001 Створено таблицю customers
002 Додано таблицю orders
003 Додано status до orders
004 Додано індекс external_order_id

SQLite і ORM

SQLite часто використовується разом з ORM.

ORM дозволяє працювати з таблицями SQLite як із моделями.

Наприклад:

  • Customer → customers;
  • Product → products;
  • Order → orders;
  • Payment → payments;
  • MigrationLog → migration_logs.

Приклад ORM + SQLite

У коді можна створити клієнта:

customer = Customer(
    name="ТОВ Клієнт Плюс",
    email="info@example.com"
)
customer.save()

ORM сформує SQL і збереже запис у SQLite.

SQLite зручна для тестування ORM, бо базу легко створити, очистити й видалити.

SQLite для тестування

SQLite часто використовують у тестах.

Переваги:

  • швидко створити базу;
  • не потрібен сервер;
  • легко очистити дані;
  • можна запускати тести локально;
  • зручно перевіряти моделі;
  • легко створювати тимчасові таблиці.

Але потрібно пам’ятати: поведінка SQLite може відрізнятися від PostgreSQL або MySQL, тому критичні SQL-запити треба перевіряти на цільовій СУБД.

SQLite у мобільних застосунках

SQLite дуже часто використовується в мобільних застосунках.

Приклади локальних даних:

  • профіль користувача;
  • кеш товарів;
  • історія замовлень;
  • офлайн-документи;
  • черга синхронізації;
  • налаштування;
  • повідомлення;
  • локальні довідники;
  • дані для роботи без інтернету.

Приклад офлайн-продажів

Менеджер працює в мобільному застосунку без інтернету.

SQLite зберігає:

  • клієнтів;
  • номенклатуру;
  • ціни;
  • залишки;
  • чернетки замовлень;
  • підписи клієнтів;
  • фото;
  • чергу синхронізації.

Коли інтернет з’являється, застосунок передає дані в ERP.

SQLite у десктопних програмах

У десктопних програмах SQLite зручна для:

  • локальних довідників;
  • налаштувань;
  • журналів;
  • кешу;
  • імпорту файлів;
  • локальної аналітики;
  • невеликих CRM;
  • складських утиліт;
  • інструментів міграції.

SQLite для міграції даних

SQLite добре підходить як проміжна база для міграції.

Наприклад, при переході з BAS або старої ERP у K2 ERP можна зробити локальну базу:

  • source_customers;
  • source_products;
  • source_contracts;
  • source_balances;
  • mapping_tables;
  • validation_errors;
  • migration_logs;
  • control_totals.

Приклад структури SQLite для міграції

CREATE TABLE migration_errors (
    id INTEGER PRIMARY KEY,
    object_type TEXT NOT NULL,
    object_id TEXT,
    error_message TEXT NOT NULL,
    created_at TEXT NOT NULL
);

У цю таблицю можна записувати помилки:

object_type object_id error_message
product T-00145 Не знайдено одиницю виміру
customer C-00077 Порожній ЄДРПОУ
contract D-00031 Не вказана валюта

SQLite і контрольні суми

Під час міграції SQLite можна використовувати для контрольних сум.

Приклад таблиці:

CREATE TABLE control_totals (
    id INTEGER PRIMARY KEY,
    object_name TEXT NOT NULL,
    source_count INTEGER,
    target_count INTEGER,
    source_amount REAL,
    target_amount REAL,
    status TEXT
);

Приклад даних:

object_name source_count target_count source_amount target_amount status
customers 12450 12450 OK
products 8200 8198 CHECK
balances 15200 15200 18200000 18200000 OK

SQLite і інтеграції

SQLite може використовуватися в інтеграційних агентах.

Наприклад, агент обміну між сайтом і ERP може зберігати:

  • чергу повідомлень;
  • зовнішні ID;
  • статуси відправки;
  • помилки;
  • повторні спроби;
  • час останньої синхронізації;
  • кеш довідників;
  • контрольні суми.

Приклад черги інтеграції

CREATE TABLE sync_queue (
    id INTEGER PRIMARY KEY,
    external_id TEXT NOT NULL,
    object_type TEXT NOT NULL,
    payload TEXT NOT NULL,
    status TEXT DEFAULT 'new',
    retry_count INTEGER DEFAULT 0,
    created_at TEXT NOT NULL
);

Статуси можуть бути:

  • new;
  • processing;
  • sent;
  • error;
  • skipped.

SQLite і JSON

SQLite може зберігати JSON як текст і в багатьох сценаріях працювати з JSON-даними.

Приклад:

CREATE TABLE api_messages (
    id INTEGER PRIMARY KEY,
    external_id TEXT,
    payload TEXT NOT NULL,
    created_at TEXT NOT NULL
);

У полі payload можна зберегти JSON із API.

Наприклад:

{
  "order_id": "WEB-10425",
  "customer": "ТОВ Клієнт Плюс",
  "total": 24500
}

SQLite і логування

SQLite зручна для локального журналу подій.

Приклад таблиці логів:

CREATE TABLE app_logs (
    id INTEGER PRIMARY KEY,
    level TEXT NOT NULL,
    message TEXT NOT NULL,
    created_at TEXT NOT NULL
);

Рівні логів:

  • info;
  • warning;
  • error;
  • critical.

Приклад логів інтеграції

level message created_at
info Завантажено 240 замовлень із сайту 2026-05-15 10:00
warning 12 товарів не знайдено по артикулу 2026-05-15 10:01
error Помилка авторизації API 2026-05-15 10:05

SQLite і аналітика

SQLite можна використовувати для локальної аналітики над файлами.

Наприклад:

  • імпортувати CSV;
  • створити таблиці;
  • зробити JOIN;
  • порахувати підсумки;
  • знайти дублікати;
  • сформувати контрольний звіт;
  • експортувати результат.

Приклад аналітики по продажах

SELECT product_id, SUM(quantity) AS qty, SUM(amount) AS total
FROM sales
GROUP BY product_id
ORDER BY total DESC;

Такий запит покаже продажі по товарах.

SQLite і Power BI

Power BI може працювати з даними, які були підготовлені в SQLite, через проміжні інструменти або драйвери.

SQLite може бути корисною для:

  • підготовки вивантажень;
  • зберігання локальних агрегатів;
  • контрольних сум;
  • тимчасових таблиць;
  • невеликих аналітичних наборів;
  • перевірки якості даних.

Пов’язана сторінка: Power BI

SQLite і K2 ERP

У K2 ERP або проєктах навколо K2 ERP SQLite може використовуватися як допоміжна база.

Приклади:

  • локальний кеш мобільного модуля;
  • проміжна база міграції;
  • журнал інтеграцій;
  • локальна черга API;
  • тестова база для прототипу;
  • тимчасове сховище контрольних сум;
  • автономний модуль для збору даних;
  • локальні налаштування агента синхронізації.

SQLite і ERP

SQLite не завжди підходить як головна база ERP, але може бути корисною в ERP-екосистемі.

Сценарії:

  • офлайн-робоче місце;
  • мобільний склад;
  • локальний касовий модуль;
  • агент обміну;
  • інструмент імпорту;
  • міграційна утиліта;
  • тестовий стенд;
  • локальний довідник;
  • кеш номенклатури;
  • контроль якості даних.

Приклад SQLite у складському модулі

Комірник працює з планшетом у зоні слабкого інтернету.

SQLite зберігає локально:

  • список товарів;
  • штрихкоди;
  • комірки;
  • завдання на відбір;
  • фактичні сканування;
  • помилки;
  • статус синхронізації.

Після відновлення зв’язку дані передаються в ERP.

SQLite і безпека

SQLite-файл потрібно захищати так само, як інші дані.

Ризики:

  • файл можна скопіювати;
  • у файлі можуть бути персональні дані;
  • у файлі можуть бути клієнти;
  • у файлі можуть бути ціни;
  • у файлі можуть бути платежі;
  • локальний комп’ютер може бути втрачений;
  • резервні копії можуть зберігатися без контролю.

Що не варто зберігати в SQLite без захисту

Без додаткового захисту не варто зберігати:

  • паролі;
  • API-ключі;
  • банківські реквізити;
  • зарплатні дані;
  • персональні дані;
  • комерційні прайси;
  • конфіденційні договори;
  • токени доступу;
  • фінансові звіти.

SQLite і шифрування

Звичайний файл SQLite сам по собі не є автоматично зашифрованим.

Для захисту можуть використовуватися:

  • шифрування диска;
  • захист операційної системи;
  • обмеження доступу до файлу;
  • окремі розширення або бібліотеки шифрування;
  • шифрування чутливих полів;
  • безпечне зберігання ключів;
  • контроль резервних копій.

SQLite і права доступу

SQLite не має такої серверної моделі користувачів і ролей, як корпоративні СУБД.

Тому права доступу зазвичай контролюються:

  • застосунком;
  • операційною системою;
  • файловими правами;
  • шифруванням;
  • логікою API;
  • окремим серверним шаром;
  • політиками доступу до пристрою.

SQLite і аудит дій

Якщо SQLite використовується в бізнес-процесах, потрібно вести аудит.

Можна створити таблицю:

CREATE TABLE audit_log (
    id INTEGER PRIMARY KEY,
    user_id TEXT,
    action TEXT NOT NULL,
    object_type TEXT,
    object_id TEXT,
    created_at TEXT NOT NULL
);

Приклад запису:

user_id action object_type object_id
petrenko update order ORD-000145
api_site create order WEB-10425

SQLite і зовнішні ID

Для інтеграцій SQLite часто зберігає зовнішні ідентифікатори.

Приклади:

  • external_order_id;
  • external_customer_id;
  • external_payment_id;
  • external_product_id;
  • external_sync_id.

Це допомагає зв’язувати локальні записи з ERP, сайтом, CRM або API.

Приклад таблиці зі зовнішнім ID

CREATE TABLE orders (
    id INTEGER PRIMARY KEY,
    external_order_id TEXT UNIQUE,
    number TEXT,
    status TEXT,
    total_amount REAL
);

Завдяки UNIQUE по external_order_id одне замовлення не завантажиться двічі.

SQLite і імпорт CSV

SQLite часто використовують для обробки CSV-файлів.

Приклад процесу:

  1. Отримати CSV від постачальника.
  2. Завантажити в SQLite.
  3. Перевірити артикулі.
  4. Знайти дублікати.
  5. Порахувати зміни цін.
  6. Сформувати файл оновлення для ERP.

Приклад таблиці імпорту прайсу

CREATE TABLE supplier_prices (
    id INTEGER PRIMARY KEY,
    supplier_sku TEXT,
    product_name TEXT,
    price REAL,
    currency TEXT,
    stock_qty REAL
);

Після завантаження можна знайти товари без артикула:

SELECT *
FROM supplier_prices
WHERE supplier_sku IS NULL OR supplier_sku = '';

SQLite і очищення даних

SQLite зручна для очищення даних перед міграцією.

Можна шукати:

  • дублікати;
  • порожні поля;
  • некоректні email;
  • товари без артикулів;
  • контрагентів без ЄДРПОУ;
  • договори без валюти;
  • документи без дати;
  • залишки без складу;
  • платежі без контрагента.

Приклад пошуку дублів

Знайти дублікати контрагентів за ЄДРПОУ:

SELECT edrpou, COUNT(*) AS cnt
FROM customers
GROUP BY edrpou
HAVING COUNT(*) > 1;

SQLite і обмеження розміру

SQLite може працювати з досить великими файлами, але практично її частіше використовують для локальних і помірних обсягів.

Важливо враховувати:

  • розмір файлу;
  • швидкість диска;
  • кількість індексів;
  • кількість записів;
  • частоту запису;
  • тривалість транзакцій;
  • резервні копії;
  • блокування;
  • потребу в архівуванні.

SQLite і VACUUM

Команда VACUUM може перебудувати файл бази й звільнити невикористане місце.

Приклад:

VACUUM;

Це може бути корисно після масового видалення або очищення даних.

Але VACUUM може займати час, тому його не варто запускати бездумно в активній системі.

SQLite і ANALYZE

Команда ANALYZE збирає статистику для оптимізатора запитів.

Приклад:

ANALYZE;

Це може допомогти SQLite краще планувати виконання запитів.

SQLite і EXPLAIN QUERY PLAN

EXPLAIN QUERY PLAN допомагає зрозуміти, як виконується запит.

Приклад:

EXPLAIN QUERY PLAN
SELECT *
FROM products
WHERE sku = 'USB-C-1M-BLK';

Це корисно для пошуку повільних запитів і перевірки, чи використовується індекс.

SQLite і продуктивність

Щоб SQLite працювала швидше, потрібно:

  • створювати правильні індекси;
  • не робити зайві запити;
  • використовувати транзакції для пакетного запису;
  • не тримати транзакції відкритими довго;
  • обмежувати розмір результату;
  • використовувати WHERE;
  • не завантажувати все одразу;
  • перевіряти план запиту;
  • використовувати WAL там, де доречно.

Приклад повільного сценарію

Поганий підхід:

  • вставляти 100 000 рядків по одному без транзакції;
  • після кожного INSERT чекати запису на диск.

Кращий підхід:

BEGIN TRANSACTION;

-- багато INSERT

COMMIT;

Пакетна транзакція може бути значно швидшою.

SQLite і помилки блокування

Іноді можна отримати помилку, що база заблокована.

Причини:

  • інший процес пише в базу;
  • довга транзакція;
  • файл відкритий кількома програмами;
  • не закрито підключення;
  • антивірус або синхронізація файлів блокує файл;
  • база лежить у проблемному мережевому каталозі.

SQLite на мережевому диску

SQLite краще використовувати на локальному диску. Робота через мережеву папку може створювати ризики:

  • блокування;
  • пошкодження;
  • нестабільна швидкість;
  • проблеми з одночасним доступом;
  • некоректна робота файлових блокувань.

Для багатокористувацького мережевого сценарію краще серверна СУБД.

SQLite і BLOB

SQLite може зберігати BLOB-дані, наприклад файли або зображення.

Але часто краще зберігати сам файл окремо, а в SQLite — шлях або метадані.

Приклад:

Варіант Перевага Ризик
Зберігати файл у BLOB Усе в одній базі База швидко росте
Зберігати файл окремо Легше керувати файлами Потрібно контролювати шляхи

SQLite і дати

SQLite часто зберігає дати як TEXT, INTEGER або REAL.

Практичний варіант — зберігати дату в ISO-форматі:

2026-05-15
2026-05-15 10:30:00

Це полегшує сортування й фільтрацію.

Приклад фільтрації за датою

SELECT *
FROM orders
WHERE order_date >= '2026-05-01'
  AND order_date < '2026-06-01';

Такий запит поверне замовлення за травень 2026 року.

SQLite і грошові суми

Для грошей потрібно бути уважним із типом REAL, бо числа з плаваючою точкою можуть давати неточності.

Практичні варіанти:

  • зберігати суму в копійках як INTEGER;
  • використовувати округлення;
  • контролювати точність у застосунку;
  • не використовувати SQLite як головний фінансовий контур великої ERP без продуманої моделі.

Приклад:

amount_cents INTEGER

1000 грн 50 коп. можна зберігати як:

100050

SQLite і NULL

NULL означає відсутність значення.

Приклад:

SELECT *
FROM contracts
WHERE end_date IS NULL;

Це може означати договори без дати завершення.

Важливо не плутати:

  • NULL;
  • порожній рядок ;
  • 0;
  • false.

SQLite і представлення

View або представлення — це збережений запит.

Приклад:

CREATE VIEW active_customers AS
SELECT id, name, email
FROM customers
WHERE active = 1;

Потім можна читати:

SELECT *
FROM active_customers;

SQLite і тригери

Тригер — це дія, яка автоматично виконується при INSERT, UPDATE або DELETE.

Приклад аудиту зміни ціни:

CREATE TRIGGER log_product_price_update
AFTER UPDATE OF price ON products
BEGIN
    INSERT INTO price_audit (product_id, old_price, new_price, changed_at)
    VALUES (old.id, old.price, new.price, datetime('now'));
END;

Тригери корисні, але їх потрібно документувати, бо прихована логіка може ускладнювати підтримку.

SQLite і тимчасові таблиці

Тимчасові таблиці корисні для проміжних розрахунків.

Приклад:

CREATE TEMP TABLE temp_duplicates AS
SELECT edrpou, COUNT(*) AS cnt
FROM customers
GROUP BY edrpou
HAVING COUNT(*) > 1;

Це зручно під час аналізу або міграції.

SQLite і CLI

SQLite має консольний інструмент, через який можна працювати з базою.

Приклад:

sqlite3 company.db

Далі можна виконувати SQL-команди:

.tables
.schema customers
SELECT * FROM customers LIMIT 10;

SQLite і Python

Python має вбудовану підтримку SQLite через модуль sqlite3.

Приклад:

import sqlite3

conn = sqlite3.connect("company.db")
cursor = conn.cursor()

cursor.execute("""
CREATE TABLE IF NOT EXISTS customers (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL
)
""")

cursor.execute("INSERT INTO customers (name) VALUES (?)", ("ТОВ Альфа",))
conn.commit()

cursor.execute("SELECT id, name FROM customers")
rows = cursor.fetchall()

conn.close()

Параметр ? допомагає безпечніше передавати значення в запит.

SQLite і параметризовані запити

Параметризовані запити зменшують ризик SQL-ін’єкцій.

Погано:

query = "SELECT * FROM customers WHERE name = '" + name + "'"

Краще:

cursor.execute("SELECT * FROM customers WHERE name = ?", (name,))

SQLite і SQL-ін’єкції

SQL-ін’єкція — це атака, коли користувач вводить текст, який змінює SQL-запит.

Навіть у SQLite потрібно:

  • використовувати параметризовані запити;
  • не склеювати SQL із введенням користувача;
  • перевіряти дані;
  • обмежувати доступ до файлу бази;
  • логувати помилки;
  • не зберігати секрети у відкритому вигляді.

SQLite і Node.js

У Node.js SQLite може використовуватися для локальних застосунків, CLI-утиліт, Electron-додатків або тестів.

Типові сценарії:

  • локальна база десктопного застосунку;
  • кеш API;
  • тестова база;
  • імпорт CSV;
  • прототип сервісу;
  • локальний журнал подій.

SQLite і PHP

У PHP SQLite може використовуватися для невеликих сайтів, внутрішніх інструментів або прототипів.

Але для великого вебсайту з багатьма одночасними записами частіше обирають серверну СУБД.

SQLite і десктопні ERP-утиліти

SQLite зручна для невеликих службових програм:

  • імпорт прайсів;
  • перевірка довідників;
  • формування файлів міграції;
  • локальний довідник контрагентів;
  • логування API;
  • синхронізація складу;
  • підготовка контрольних сум.

SQLite і Docker

SQLite можна використовувати в контейнерах, але потрібно правильно зберігати файл бази.

Важливо:

  • не втрачати файл після перезапуску контейнера;
  • використовувати volume;
  • контролювати резервні копії;
  • не запускати багато контейнерів, які одночасно пишуть в один файл;
  • розуміти обмеження файлової бази.

SQLite і Git

SQLite-файл зазвичай не дуже зручний для зберігання в Git, якщо він часто змінюється.

Краще зберігати в Git:

  • SQL-міграції;
  • схему бази;
  • тестові seed-дані;
  • документацію;
  • скрипти створення.

А сам файл бази часто додають у .gitignore.

SQLite і документація схеми

Для підтримки важливо документувати:

  • таблиці;
  • поля;
  • ключі;
  • індекси;
  • тригери;
  • представлення;
  • зв’язки;
  • правила міграції;
  • контрольні суми;
  • джерела даних.

Приклад документації таблиці

Таблиця Призначення Ключові поля
customers Контрагенти id, edrpou, name
products Номенклатура id, sku, name
orders Замовлення id, external_order_id, customer_id
migration_errors Помилки міграції object_type, object_id, error_message

Типові помилки при використанні SQLite

Поширені помилки:

  • використовувати SQLite як серверну ERP-базу для багатьох користувачів;
  • не робити резервні копії;
  • зберігати файл у ненадійному місці;
  • не створювати індекси;
  • не використовувати транзакції;
  • вставляти великі обсяги рядок за рядком без транзакції;
  • зберігати секрети без захисту;
  • не контролювати зовнішні ключі;
  • не документувати схему;
  • копіювати файл під час активного запису;
  • використовувати SQLite на нестабільному мережевому диску.

Типові помилки при міграції через SQLite

Поширені помилки:

  • не зберігати зовнішні ID;
  • не рахувати контрольні суми;
  • не логувати помилки;
  • не робити таблиці мапінгу;
  • не фіксувати джерело даних;
  • не перевіряти дублікати;
  • не зберігати версію вивантаження;
  • не відокремлювати сирі дані від очищених;
  • не робити повторюваний процес завантаження;
  • не документувати структуру проміжної бази.

Добра структура SQLite для міграції

Для міграції краще мати окремі групи таблиць:

  • raw_* — сирі дані з джерела;
  • clean_* — очищені дані;
  • map_* — таблиці відповідності;
  • err_* — помилки;
  • log_* — журнали;
  • ctl_* — контрольні суми;
  • export_* — фінальні дані для завантаження.

Приклад:

Таблиця Призначення
raw_products Дані товарів як у джерелі
clean_products Очищена номенклатура
map_products Відповідність старого й нового коду
err_products Помилки товарів
ctl_products Контрольні суми по товарах

Переваги SQLite

Основні переваги:

  • проста установка;
  • один файл бази;
  • не потрібен сервер;
  • підтримка SQL;
  • транзакції;
  • хороша швидкість для локальних задач;
  • зручність для тестів;
  • зручність для мобільних застосунків;
  • зручність для міграційних утиліт;
  • переносимість;
  • мінімальне адміністрування.

Недоліки SQLite

Основні недоліки:

  • не ідеальна для багатьох одночасних записів;
  • немає повноцінної серверної моделі користувачів;
  • не найкращий вибір для великої ERP;
  • обмежені можливості адміністрування порівняно із серверними СУБД;
  • потрібно уважно працювати з файлами;
  • ризик блокувань;
  • не варто зберігати чутливі дані без захисту;
  • не всі можливості SQL такі самі, як у великих СУБД.

SQLite у навчанні SQL

SQLite добре підходить для навчання SQL.

Можна вивчати:

  • створення таблиць;
  • SELECT;
  • INSERT;
  • UPDATE;
  • DELETE;
  • JOIN;
  • GROUP BY;
  • індекси;
  • транзакції;
  • обмеження;
  • представлення;
  • тригери.

Для старту достатньо встановити інструмент SQLite або використати мову програмування з підтримкою SQLite.

Що підготувати перед використанням SQLite у проєкті

Потрібно визначити:

  • обсяг даних;
  • кількість користувачів;
  • частоту запису;
  • потребу в одночасному доступі;
  • чутливість даних;
  • резервне копіювання;
  • структуру таблиць;
  • індекси;
  • транзакції;
  • міграції структури;
  • спосіб логування;
  • правила очищення;
  • сценарій переходу на серверну СУБД, якщо проєкт виросте.

SQLite і перехід на серверну СУБД

Іноді проєкт починається з SQLite, а потім переходить на PostgreSQL або іншу серверну СУБД.

Причини переходу:

  • виросла кількість користувачів;
  • зросло навантаження;
  • потрібна реплікація;
  • потрібні складні права;
  • потрібна серверна інфраструктура;
  • потрібна висока доступність;
  • потрібна масштабованість;
  • з’явилась велика ERP-логіка.

Пов’язані сторінки

FAQ

Що таке SQLite простими словами?

SQLite — це легка база даних, яка зберігає всі таблиці й записи в одному файлі та не потребує окремого сервера.

Для чого використовують SQLite?

SQLite використовують у мобільних застосунках, десктопних програмах, тестах, кешах, локальних утилітах, прототипах, IoT, міграційних інструментах і невеликих внутрішніх системах.

Чим SQLite відрізняється від PostgreSQL або MySQL?

SQLite працює як вбудована файлова база без окремого сервера. PostgreSQL і MySQL — це серверні СУБД, краще пристосовані для багатьох користувачів, великих систем і високого навантаження.

Чи підходить SQLite для ERP?

SQLite може бути корисною для локальних модулів, кешів, мобільних застосунків, агентів обміну або міграційних утиліт. Але як основна база великої багатокористувацької ERP вона зазвичай не підходить.

Чи підтримує SQLite SQL?

Так. SQLite підтримує SQL-запити: SELECT, INSERT, UPDATE, DELETE, JOIN, GROUP BY, індекси, транзакції, обмеження, представлення й тригери.

Чи підтримує SQLite транзакції?

Так. SQLite підтримує транзакції через BEGIN, COMMIT і ROLLBACK. Це важливо для цілісності даних.

Що таке WAL у SQLite?

WAL — це Write-Ahead Logging, режим журналювання, який може покращити паралельне читання й запис у певних сценаріях.

Чи безпечна SQLite для конфіденційних даних?

SQLite-файл потрібно захищати. Без додаткових заходів його можна скопіювати. Для чутливих даних потрібні файлові права, шифрування, захист пристрою й контроль резервних копій.

Чи можна використовувати SQLite для міграції даних?

Так. SQLite зручна як проміжна база для очищення даних, мапінгу, логів помилок, контрольних сум і підготовки файлів для завантаження в ERP.

Який результат правильного використання SQLite?

Результат — проста, переносима й надійна локальна база для задач, де не потрібен окремий сервер: кеш, мобільний застосунок, прототип, тестування, міграція або невеликий інструмент.

Коротко

Питання Відповідь
Що таке SQLite? Вбудована реляційна база даних, яка зберігає дані в одному файлі.
Для чого потрібна? Для локальних застосунків, мобільних програм, кешу, тестів, прототипів, логів і міграційних утиліт.
Чи потрібен сервер? Ні, SQLite працює без окремого серверного процесу.
Чи підтримує SQL? Так, підтримує таблиці, SELECT, INSERT, UPDATE, DELETE, JOIN, індекси, транзакції й обмеження.
Де корисна в ERP? У локальних модулях, мобільному офлайні, агентах інтеграції, кешах, тестах і проміжних базах міграції.
Які головні ризики? Обмеження одночасного запису, відсутність серверної моделі прав, ризик копіювання файлу й неправильне використання у великих системах.
Який результат? Проста файлова база для надійного локального зберігання даних без складного адміністрування.