Как установить расширение для SQLite
SQLite — это миниатюрная, но мощная встраиваемая СУБД. У нее есть один недостаток: маловато встроенных функций по сравнению с PostgreSQL или Oracle. К счастью, авторы заложили в SQLite механизм расширений, на котором можно сделать почти все что угодно.
Обычно добавить расширение в SQLite несложно. Скачиваете файл, выполняете одну команду — и готово. Но иногда люди сталкиваются с проблемами, поэтому я решил написать это руководство.
Чтобы использовать расширение, его надо скачать и подключить. Мы разберем каждый из шагов по отдельности.
- Скачать
- Подключить: консоль
- Подключить: GUI или IDE
- Подключить: Python
- Подключить: Node.js
- Подключить: Go
- Что дальше
Скачать
Предположим, вы нашли интересное расширение. Теперь надо его скачать.
Расширение для 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!