Все расширения для SQLite
Мне очень нравится SQLite. Это миниатюрная встраиваемая база, которая отлично подходит как для исследовательского анализа данных, так и в качестве хранилища для небольших приложений (писал об этом, не буду повторяться).
Но есть у нее один недостаток: маловато встроенных функций по сравнению с PostgreSQL или Oracle. К счастью, авторы заложили в SQLite механизм расширений, на котором можно сделать почти все что угодно. В результате интернет заполнен обрывочными расширениями, которые добавляют функцию-другую.
Мне хотелось большой системности. В результате появился проект sqlean — в нем я собираю вместе недостающие в SQLite функции, распределяю их по модулям, рефакторю код, пишу тесты и документацию. Получается что-то вроде стандартной библиотеки, как в Python или Go, только для SQLite.
Я планирую подробно написать про каждый модуль в отдельной статье, а пока — вот краткий обзор.
Основной набор
Это самые популярные функции, которых не хватало в SQLite:
- crypto: хеш-функции вроде MD5, SHA-1 и SHA-256.
- define: пользовательские функции и динамический SQL.
- fileio: работа с файловой системой — чтение и запись файлов, создание каталогов.
- fuzzy: нечеткое сравнение строк, фонетические алгоритмы, транслитерация.
- ipaddr: манипуляция IP-адресами и подсетями.
- json1: работа с JSON.
- math: математические функции.
- regexp: регулярные выражения.
- stats: статистика — медиана, процентили, стандартное отклонение.
- text: работа со строками.
- unicode: поддержка юникода для функций
upper()
,lower()
иLIKE
. - uuid: генерация уникальных идентификаторов.
- vsv: работа с CSV-файлами как с таблицами базы.
Все расширения можно скачать для Windows, Linix и macOS.
Инкубатор
Функции, которые пока не вошли в основной набор. Эти расширения могут быть плохо структурированы, но я их постепенно рефакторю и переношу в основные.
- array: работа с массивами (почти как в постгресе).
- besttype: преобразует строку в подходящий числовой тип.
- bloom: быстрый вероятностный способ понять, есть значение в таблице или нет.
- cbrt: кубический корень из числа.
- classifier: бинарный классификатор на логистической регрессии.
- compress и sqlar: архивация и распаковка данных.
- cron: проверяет даты по cron-шаблонам.
- define: динамически создает скалярные и табличные функции прямо из SQL.
- envfuncs: читает переменные среды.
- fcmp: сравнение и округление десятичных дробей.
- isodate: дополнительные функции для работы с датами.
- math2: больше математических функций и битовой арифметики.
- pearson: корреляция Пирсона между двумя наборами данных.
- pivotvtab: сводные таблицы.
- recsize: считает размер записи в таблице.
- spellfix: быстрый поиск похожих слов в словаре.
- stats2 и stats3: еще больше матстатистики.
- text2: еще больше функций для работы со строками.
- uint: натуральная сортировка и сравнение строк, содержащих числа (natsort).
- unhex: преобразует строку в бинарные данные (обратная операция для
hex()
). - xmltojson: преобразует XML в JSON.
- zipfile: читает и пишет zip-архивы.
Голосуйте за расширения в инкубаторе! Чем популярнее расширение, тем быстрее оно попадет в основной набор.
Инкубаторные расширения тоже можно скачать.
Как подключить расширение
Для начала, скачайте свежий релиз. Затем подключите расширение как описано ниже.
Примеры используют расширение stats
; вы можете указать любое другое.
Если работаете с командной строкой SQLite (sqlite.exe
):
sqlite> .load ./stats
sqlite> select median(value) from generate_series(1, 99);
Если используете инструмент вроде SQLiteStudio, SQLiteSpy или DBeaver:
select load_extension('c:\Users\anton\sqlite\stats.dll');
select median(value) from generate_series(1, 99);
Python:
import sqlite3
connection = sqlite3.connect(":memory:")
connection.enable_load_extension(True)
connection.load_extension("./stats")
connection.execute("select median(value) from generate_series(1, 99)")
connection.close()
Node.js, с библиотекой better-sqlite3:
const sqlite3 = require("better-sqlite3");
const db = new sqlite3(":memory:");
db.loadExtension("./stats");
db.exec("select median(value) from generate_series(1, 99)");
db.close();
Что дальше
Если почувствуете, что в SQLite вам не хватает какой-то функции — приходите в репозиторий sqlean, там наверняка найдется.
Я продолжаю добавлять новые расширения в инкубатор, а расширения из инкубатора рефакторю и переношу в основные. По каждому основному модулю планирую написать отдельную статью с примерами.
А если захотите поучаствовать — присылайте свои или чужие расширения.
Всем SQLite!
Подписывайтесь на канал, чтобы не пропустить новые заметки 🚀