Современный SQLite: Вычисляемые столбцы
Вычисляемые (generated) столбцы рассчитываются на основании других столбцов той же таблицы. Например, мы можем рассчитать процент отказов на основе количества запросов:
Другой распространенный сценарий — вытащить поле JSON-документа в отдельный столбец, и при необходимости проиндексировать его:
Результат:
Так SQLite превращается в документную базу данных:
— Храним JSON-документы как текст или blob-поле.
— Извлекаем отдельные поля через вычисляемые столбцы.
— Строим индексы, если нужна быстрая выборка.
Вычисляемые столбцы могут рассчитываться на лету (virtual) или храниться на диске (stored). Stored-столбцы редко используют на практике.
Работает в SQLite 3.31+ (январь 2020).
песочница • документация
Вычисляемые (generated) столбцы рассчитываются на основании других столбцов той же таблицы. Например, мы можем рассчитать процент отказов на основе количества запросов:
create table stats (
date text,
n_total int,
n_failed int,
fail_perc as (n_failed*100.0 / n_total)
);
Другой распространенный сценарий — вытащить поле JSON-документа в отдельный столбец, и при необходимости проиндексировать его:
create table events (
id integer primary key,
event blob,
etime text as (event ->> 'time'),
etype text as (event ->> 'type')
);
create index events_time on events(etime);
insert into events(event) values
('{"time": "2024-05-01", "type": "credit"}'),
('{"time": "2024-05-02", "type": "debit"}'),
('{"time": "2024-05-03", "type": "close"}');
select etime, etype from events;
Результат:
┌────────────┬────────┐
│ etime │ etype │
├────────────┼────────┤
│ 2024-05-01 │ credit │
│ 2024-05-02 │ debit │
│ 2024-05-03 │ close │
└────────────┴────────┘
Так SQLite превращается в документную базу данных:
— Храним JSON-документы как текст или blob-поле.
— Извлекаем отдельные поля через вычисляемые столбцы.
— Строим индексы, если нужна быстрая выборка.
Вычисляемые столбцы могут рассчитываться на лету (virtual) или храниться на диске (stored). Stored-столбцы редко используют на практике.
Работает в SQLite 3.31+ (январь 2020).
песочница • документация
Работа с датой и временем в SQLite
В sqlite есть встроенные функции для работы с датами, но они мне всегда не слишком нравились.
Поэтому разработал расширение
https://antonz.org/sqlean-time
В sqlite есть встроенные функции для работы с датами, но они мне всегда не слишком нравились.
Поэтому разработал расширение
sqlean-time
. Оно поддерживает точность вплоть до наносекунд и предоставляет удобное структурированное API с большим количеством функций.https://antonz.org/sqlean-time
antonz.org
High-precision date/time in SQLite
A rich set of functions for working with date, time and durations.
crypto: Хеши, кодирование и декодирование в SQLite
Открываю новую серию заметок. В каждом посте буду рассказывать об одном полезном расширении SQLite.
Начнем с nalgeon/crypto. Оно предоставляет функции для расчета хешей, а также кодирования и декодирования данных.
Хеши:
Кодирование/декодирование:
Base32:
Base64:
Hex:
Еще поддерживаются Base85 и url-encoding.
Как установить расширение
Открываю новую серию заметок. В каждом посте буду рассказывать об одном полезном расширении SQLite.
Начнем с nalgeon/crypto. Оно предоставляет функции для расчета хешей, а также кодирования и декодирования данных.
Хеши:
select crypto_blake3('abc');
select crypto_md5('abc');
select crypto_sha1('abc');
select crypto_sha256('abc'));
-- и другие
Кодирование/декодирование:
Base32:
select crypto_encode('hello', 'base32');
-- NBSWY3DP
select crypto_decode('NBSWY3DP', 'base32');
-- hello
Base64:
select crypto_encode('hello', 'base64');
select crypto_decode('aGVsbG8=', 'base64');
Hex:
select crypto_encode('hello', 'hex');
select crypto_decode('68656c6c6f', 'hex');
Еще поддерживаются Base85 и url-encoding.
Как установить расширение
define: Пользовательские функции в SQLite
Как известно, в SQLite нет хранимых процедур.
Предполагается, что вместо них программист реализует нужные функции в своем коде (например, на Python) и зарегистрирует их в SQLite (так называемые application-defined functions).
Но можно добавлять новые функции и прямо из SQL, если установить расширение nalgeon/define:
Еще пример:
Расширение также включает функцию eval — можно динамически выполнять SQL из строки:
Как установить расширение
Как известно, в SQLite нет хранимых процедур.
Предполагается, что вместо них программист реализует нужные функции в своем коде (например, на Python) и зарегистрирует их в SQLite (так называемые application-defined functions).
Но можно добавлять новые функции и прямо из SQL, если установить расширение nalgeon/define:
-- Суммирует числа от 1 до n
select define('sumn', ':n * (:n + 1) / 2');
select sumn(5);
-- 15
Еще пример:
-- Генерит случайное число от 1 до n
select define('randint', ':a + abs(random()) % (:b - :a + 1)');
select randint(10, 99);
-- 67
Расширение также включает функцию eval — можно динамически выполнять SQL из строки:
-- Создаем и заполняем таблицу
select eval('create table tmp(value int)');
select eval('insert into tmp(value) values (1), (2), (3)');
select count(*) from tmp;
-- 3
Как установить расширение
fileio: Работа с файлами в SQLite
Расширение nalgeon/fileio добавляет в SQLite возможность читать и писать файлы прямо из SQL.
fileio_write записывает данные в файл:
fileio_read читает содержимое файла:
fileio_scan читает файл построчно, не загружая целиком в память:
Кроме того, есть fileio_append (дописывает данные в файл) и функции для работы с каталогами — fileio_mkdir (создает каталог) и fileio_ls (читает содержимое каталога).
Как установить расширение
Расширение nalgeon/fileio добавляет в SQLite возможность читать и писать файлы прямо из SQL.
fileio_write записывает данные в файл:
select fileio_write('hello.txt', 'hello world');
fileio_read читает содержимое файла:
select fileio_read('hello.txt');
-- hello world
fileio_scan читает файл построчно, не загружая целиком в память:
select rowid, value from fileio_scan('lines.txt');
-- 1,one
-- 2,two
-- 3,three
Кроме того, есть fileio_append (дописывает данные в файл) и функции для работы с каталогами — fileio_mkdir (создает каталог) и fileio_ls (читает содержимое каталога).
Как установить расширение
fuzzy: Нечеткое сравнение строк в SQLite
Расширение nalgeon/fuzzy помогает сравнивать строки на похожесть и транслитерировать текст.
Одни функции считают расстояние между строками (чем оно больше, тем сильнее отличаются строки):
Другие функции рассчитывают фонетический код строки (помогает определять слова, которые похоже звучат):
Транслитерация преобразует строку в ASCII-строку (только латинские символы), чтобы с ней могли работать функции расстояния и фонетики:
Как установить расширение
Расширение nalgeon/fuzzy помогает сравнивать строки на похожесть и транслитерировать текст.
Одни функции считают расстояние между строками (чем оно больше, тем сильнее отличаются строки):
-- Расстояние Дамерау-Левенштейна
select fuzzy_damlev('awesome', 'aewsme');
-- 2
-- Расстояние Хэмминга
select fuzzy_hamming('awesome', 'aewsome');
-- 2
-- Расстояние Джаро-Винклера
select fuzzy_jarowin('awesome', 'aewsme');
-- 0.907142857142857
Другие функции рассчитывают фонетический код строки (помогает определять слова, которые похоже звучат):
-- Caverphone
select fuzzy_caver('awesome');
-- AWSM111111
select fuzzy_caver('owesome');
-- AWSM111111
-- Refined soundex
select fuzzy_rsoundex('awesome');
-- A03080
select fuzzy_rsoundex('awssome');
-- A03080
Транслитерация преобразует строку в ASCII-строку (только латинские символы), чтобы с ней могли работать функции расстояния и фонетики:
select fuzzy_translit('sí señor');
-- si senor
select fuzzy_translit('привет');
-- privet
Как установить расширение