Как установить расширение для 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 в качестве примера; не забудьте поменять название и путь к файлу, если будете копировать команды.

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

Консоль 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

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

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

Windows:

select load_extension('c:\Users\anton\Downloads\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\Downloads\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()

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

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

Windows:

const sqlite3 = require("better-sqlite3");
const db = new sqlite3(":memory:");
db.loadExtension(`c:\Users\anton\Downloads\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\Downloads\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!