Как установить расширение для SQLite

SQLite — это миниатюрная, но мощная встраиваемая СУБД. У нее есть один недостаток: маловато встроенных функций по сравнению с PostgreSQL или Oracle. К счастью, авторы заложили в SQLite механизм расширений, на котором можно сделать почти все что угодно.

Обычно добавить расширение в SQLite несложно. Скачиваете файл, выполняете одну команду — и готово. Но иногда люди сталкиваются с проблемами, поэтому я решил написать это руководство.

Чтобы использовать расширение, его надо скачать и подключить. Мы разберем каждый из шагов по отдельности.

Скачать: вручную

Предположим, вы нашли интересное расширение. Теперь надо его скачать.

Расширение для SQLite — это одиночный файл:

  • *.dll для Windows (например, stats.dll)
  • *.so для Linux (stats.so)
  • *.dylib для macOS (stats.dylib)

Скачайте файл и сохраните его на диске. Мы будем использовать папку «Загрузки» (Downloads):

  • %USERPROFILE%\Downloads на Windows (например, C:\Users\anton\Downloads)
  • ~/Downloads на Linux или macOS (/home/anton/Downloads или /Users/anton/Downloads)

Теперь можно подключать!

Я буду использовать расширение stats в качестве примера; не забудьте поменять название и путь к файлу, если будете копировать команды.

Скачать: через менеджер пакетов

Раньше я часто сохранял скачанные расширения куда попало и потом не мог их найти. Поэтому, чтобы хранить их централизованно и не терять, сделал sqlpkg — менеджер пакетов для расширений SQLite.

Чтобы скачать расширение через sqlpkg, выполните команду install.

Windows:

sqlpkg.exe install nalgeon/stats

Linux/macOS:

sqlpkg install nalgeon/stats

nalgeon/stats — это идентификатор расширения. Его можно узнать в реестре пакетов. Загляните туда — там полно расширений!

sqlpkg сохраняет все расширения в специальный каталог:

  • %USERPROFILE%\.sqlpkg в Windows
  • ~/.sqlpkg в Linux/macOS

Для нашего расширения nalgeon/stats получится так:

  • C:\Users\anton\.sqlpkg\nalgeon\stats\stats.dll в Windows
  • /home/anton/.sqlpkg/nalgeon/stats/stats.so в Linux
  • /Users/anton/.sqlpkg/nalgeon/stats/stats.dylib в macOS

Не забудьте поменять путь к файлу, если будете копировать команды из примеров ниже.

Подключить: консоль

Консоль SQLite (CLI, она же shell) — это утилита командной строки sqlite3.exe для Windows или sqlite3 для Linux/macOS).

Запустите ее и подключите расширение командой .load.

Windows:

.load c:/Users/anton/Downloads/stats

Linux/macOS:

.load /Users/anton/Downloads/stats

Теперь расширение можно использовать! Например, stats добавляет функции median и generate_series:

select median(value) from generate_series(1, 99);

Примечание для macOS. Макось может блокировать неподписанные бинарные файлы и запрещать загрузку расширений. Чтобы это исправить, уберите расширение из карантина, выполнив следующую команду в терминале:

xattr -d com.apple.quarantine /Users/anton/Downloads/stats.dylib

А еще стандартная консоль SQLite на макоси не поддерживает расширения вовсе. Используйте специальную сборку, чтобы они заработали.

Подключить: GUI или IDE

Чтобы подключить расширение в SQLiteStudio, SQLiteSpy, DBeaver и других аналогичных программах, используйте функцию load_extension.

Windows:

select load_extension('c:\Users\anton\sqlite\stats');

Linux/macOS:

select load_extension('/Users/anton/Downloads/stats');

Подключить: Python

Используйте стандартный модуль sqlite3.

Windows:

import sqlite3

conn = sqlite3.connect(":memory:")
conn.enable_load_extension(True)
conn.load_extension(r"c:\Users\anton\sqlite\stats")
conn.execute("select median(value) from generate_series(1, 99)")
conn.close()

Linux/macOS:

import sqlite3

conn = sqlite3.connect(":memory:")
conn.enable_load_extension(True)
conn.load_extension("/Users/anton/Downloads/stats")
conn.execute("select median(value) from generate_series(1, 99)")
conn.close()

Примечание для macOS. Стандартный модуль sqlite3 на макоси не умеет загружать расширения. Используйте пакет sqlean.py — он полностью совместим со стандартным и поддерживает расширения.

Подключить: Node.js

Используйте пакет better-sqlite3.

Windows:

const sqlite3 = require("better-sqlite3");
const db = new sqlite3(":memory:");
db.loadExtension(`c:\Users\anton\sqlite\stats`);
db.exec("select median(value) from generate_series(1, 99)");
db.close();

Linux/macOS:

const sqlite3 = require("better-sqlite3");
const db = new sqlite3(":memory:");
db.loadExtension("/Users/anton/Downloads/stats");
db.exec("select median(value) from generate_series(1, 99)");
db.close();

Подключить: Go

Используйте пакет mattn/go-sqlite3.

Windows:

package main

import (
    "database/sql"
    "fmt"

    sqlite3 "github.com/mattn/go-sqlite3"
)

func main() {
    sql.Register("sqlite3_with_extensions",
        &sqlite3.SQLiteDriver{
            Extensions: []string{
                `c:\Users\anton\sqlite\stats`,
            },
        })

    db, err := sql.Open("sqlite3_with_extensions", ":memory:")
    db.Query("select median(value) from generate_series(1, 99)")
    db.Close()
}

Linux/macOS:

package main

import (
    "database/sql"
    "fmt"

    sqlite3 "github.com/mattn/go-sqlite3"
)

func main() {
    sql.Register("sqlite3_with_extensions",
        &sqlite3.SQLiteDriver{
            Extensions: []string{
                "/Users/anton/Downloads/stats",
            },
        })

    db, err := sql.Open("sqlite3_with_extensions", ":memory:")
    db.Query("select median(value) from generate_series(1, 99)")
    db.Close()
}

Обратите внимание: мы используем один и тот же идентификатор sqlite3_with_extensions в sql.Register и sql.Open.

Что дальше

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

И попробуйте менеджер пакетов, если предпочитаете консольные утилиты.

И реестр, и менеджер — новые проекты, так что в них есть некоторые шероховатости. Но свою задачу они выполняют.

Всем SQLite!

Подписывайтесь на канал, чтобы не пропустить новые заметки 🚀