sqlite-ecosystem
我(Alex Garcia 👋🏼)编写并开源的所有 SQLite 扩展、工具和指南。
欢迎在此仓库中发起关于 SQLite 扩展和工具元层面的讨论!但如果您在某个特定扩展或工具上遇到具体问题,请在该项目的仓库中提交 issue。
概述
以下是我构建的所有可加载 SQLite 扩展,以及它们所使用的编程语言和分发渠道。
| 扩展 | 描述 | 语言 | Python | Node.js | Deno | Ruby | Datasette | sqlite-utils |
|---|---|---|---|---|---|---|---|---|
sqlite-http | 发起 HTTP 请求 | Go | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
sqlite-html | 解析 HTML 文档 | Go | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
sqlite-lines | 逐行读取文件/二进制大对象 | C | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
sqlite-path | 解析和生成文件路径 | C | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
sqlite-url | 解析和生成 URL | C | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
sqlite-xsv | 查询 CSV 文件 | Rust | ✅ | ✅ | ✅ | ✅ | 🚧 | 🚧 |
sqlite-regex | 正则表达式函数 | Rust | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
sqlite-ulid | 处理 ULID | Rust | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
sqlite-jsonschema | 使用 JSON Schema 验证 JSON 对象 | Rust | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
sqlite-fastrand | 快速生成快速数字/数据块 | Rust | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
sqlite-vss | SQLite 中的向量搜索 | C++ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
扩展
sqlite-http
一个用于纯粹通过 SQL 发起 HTTP 请求的 SQLite 扩展。
- 创建 GET、POST 及其他 HTTP 请求,类似于 curl、wget 和 fetch
- 下载响应体、头部、状态码、计时信息
- 设置速率限制、超时
select http_get_body('https://text.npr.org/');
select
http_get_body('https://api.github.com/repos/sqlite/sqlite') ->> '$.description';
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-http | |
| Node.js | npm install sqlite-http | |
| Deno | deno.land/x/sqlite_http | |
| Datasette | datasette install datasette-sqlite-http | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-http | |
| Ruby | gem install sqlite-http | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)windows-x86_64(Windows x86_64)
sqlite-html
一个用于查询、操作和创建 HTML 元素的 SQLite 扩展。
- 使用 CSS 选择器从 HTML 中提取 HTML 或文本,例如
.querySelector()、.innerHTML和.innerText - 根据 CSS 选择器生成匹配元素的表格,例如
.querySelectorAll() - 在查询中安全地创建 HTML 元素,例如 .createElement() 和
.appendChild()
select html_extract('<p> Anakin <b>Skywalker</b> </p>', 'b'); -- "<b>Skywalker</b>"
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-html | |
| Node.js | npm install sqlite-html | |
| Deno | deno.land/x/sqlite_html | |
| Datasette | datasette install datasette-sqlite-html | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-html | |
| Ruby | gem install sqlite-html | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)windows-x86_64(Windows x86_64)
sqlite-lines
一个用于逐行高效读取大文件或 BLOB 的 SQLite 扩展。
select line from lines_read('logs.txt');
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-lines | |
| Node.js | npm install sqlite-lines | |
| Deno | deno.land/x/sqlite_lines | |
| Datasette | datasette install datasette-sqlite-lines | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-lines | |
| Ruby | gem install sqlite-lines | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)
sqlite-path
一个用于解析、生成和查询路径的 SQLite 扩展。
select path_dirname('foo/bar.txt'); -- 'foo/'
select path_basename('foo/bar.txt'); -- 'bar.txt'
select path_extension('foo/bar.txt'); -- '.txt'
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-path | |
| Node.js | npm install sqlite-path | |
| Deno | deno.land/x/sqlite_path | |
| Datasette | datasette install datasette-sqlite-path | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-path | |
| Ruby | gem install sqlite-path | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)windows-x86_64(Windows x86_64)
sqlite-url
一个用于解析、生成和查询 URL 及查询字符串的 SQLite 扩展
- 提取 URL 的特定部分,如协议、主机名和路径
- 安全地生成包含各部分的 URL
- 遍历查询字符串中的所有键和值
select url_valid('https://sqlite.org'); -- 1
select url_scheme('https://www.sqlite.org/vtab.html#usage'); -- 'https'
select url_host('https://www.sqlite.org/vtab.html#usage'); -- 'www.sqlite.org'
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-url | |
| Node.js | npm install sqlite-url | |
| Deno | deno.land/x/sqlite_url | |
| Datasette | datasette install datasette-sqlite-url | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-url | |
| Ruby | gem install sqlite-url | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)
sqlite-xsv
一个快速且高性能的 SQLite 扩展,用于处理 CSV 文件,使用 Rust 编写!
- 将 CSV、TSV 及其他-SV 作为 SQLite 虚拟表进行查询
- “reader” 接口允许你从其他数据源查询 CSV,例如
sqlite-http - 内置支持查询带有 gzip 或 zstd 压缩的 CSV
create virtual table temp.students using csv(
filename="students.csv"
);
select * from temp.students;
create virtual table temp.students_gz using csv(
filename="students.csv.gz"
);
create virtual table temp.students_reader using csv_reader(
id integer,
name text,
age integer,
progess real
);
select * from temp.students_reader('./target/students.csv');
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-xsv | |
| Node.js | npm install sqlite-xsv | |
| Deno | deno.land/x/sqlite_xsv | |
| Ruby | gem install sqlite-xsv | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)windows-x86_64(Windows x86_64)
sqlite-regex
一个用于正则表达式的高速 SQLite 扩展。
select regex_find(
'[0-9]{3}-[0-9]{3}-[0-9]{4}',
'phone: 111-222-3333'
);
select rowid, *
from regex_find_all(
'\b\w{13}\b',
'Retroactively relinquishing remunerations is reprehensible.'
);
/*
┌───────┬───────┬─────┬───────────────┐
│ rowid │ start │ end │ match │
├───────┼───────┼─────┼───────────────┤
│ 0 │ 0 │ 13 │ Retroactively │
│ 1 │ 14 │ 27 │ relinquishing │
│ 2 │ 28 │ 41 │ remunerations │
│ 3 │ 45 │ 58 │ reprehensible │
└───────┴───────┴─────┴───────────────┘
*/
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-regex | |
| Node.js | npm install sqlite-regex | |
| Deno | deno.land/x/sqlite_regex | |
| Datasette | datasette install datasette-sqlite-regex | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-regex | |
| Ruby | gem install sqlite-regex | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)windows-x86_64(Windows x86_64)
sqlite-ulid
一个用于生成和处理 ULIDs 的 SQLite 扩展。
select ulid(); -- '01gqr4j69cc7w1xdbarkcbpq17'
select ulid_bytes(); -- X'0185310899dd7662b8f1e5adf9a5e7c0'
select ulid_with_prefix('invoice'); -- 'invoice_01gqr4jmhxhc92x1kqkpxb8j16'
select ulid_datetime('01gqr4j69cc7w1xdbarkcbpq17') -- '2023-01-26 22:53:20.556'
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-ulid | |
| Node.js | npm install sqlite-ulid | |
| Deno | deno.land/x/sqlite_ulid | |
| Datasette | datasette install datasette-sqlite-ulid | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-ulid | |
| Ruby | gem install sqlite-ulid | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)windows-x86_64(Windows x86_64)
sqlite-jsonschema
一个用于使用 JSON Schema 验证 JSON 对象的 SQLite 扩展。
select jsonschema_matches('{"maxLength": 5}', json_quote('alex')); -- 1
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-jsonschema | |
| Node.js | npm install sqlite-jsonschema | |
| Deno | deno.land/x/sqlite_jsonschema | |
| Datasette | datasette install datasette-sqlite-jsonschema | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-jsonschema | |
| Ruby | gem install sqlite-jsonschema | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)windows-x86_64(Windows x86_64)
sqlite-fastrand
一个用于快速生成随机数、布尔值、字符和二进制大对象的 SQLite 扩展
select fastrand_int(); -- 556823563
select fastrand_alphabetic(); -- 's'
select fastrand_uppercase();-- 'M'
select fastrand_double(); -- 0.740834390248454
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-fastrand | |
| Node.js | npm install sqlite-fastrand | |
| Deno | deno.land/x/sqlite_fastrand | |
| Datasette | datasette install datasette-sqlite-fastrand | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-fastrand | |
| Ruby | gem install sqlite-fastrand | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)windows-x86_64(Windows x86_64)
sqlite-vss
一个基于 Faiss 的高效向量搜索 SQLite 扩展!
create virtual table vss_articles using vss0(
headline_embedding(384),
description_embedding(384),
);
insert into vss_articles(rowid, headline_embedding)
select rowid, headline_embedding from articles;
select rowid, distance
from vss_articles
where vss_search(
headline_embedding,
(select headline_embedding from articles where rowid = 123)
)
limit 100;
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-vss | |
| Node.js | npm install sqlite-vss | |
| Deno | deno.land/x/sqlite_vss | |
| Datasette | datasette install datasette-sqlite-vss | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-vss | |
| Ruby | gem install sqlite-vss | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)
sqlite-hello
最小的“Hello world” SQLite 扩展。
sqlite> .load ./hello0
sqlite> select hello('Alex');
'Hello, Alex!'
| 语言/平台 | 安装 | |
|---|---|---|
| Python | pip install sqlite-hello | |
| Node.js | npm install sqlite-hello | |
| Deno | deno.land/x/sqlite_hello | |
| Datasette | datasette install datasette-sqlite-hello | |
| sqlite-utils | sqlite-utils install sqlite-utils-sqlite-hello | |
| Ruby | gem install sqlite-hello | |
| Github Release |
linux-x86_64(Linux x86_64)macos-x86_64(MacOS x86_64)macos-aarch64(MacOS M1 and M2 chips)windows-x86_64(Windows x86_64)
分发
SQLite 扩展在历史上很难与他人共享。安装和使用它们可能很棘手且令人困惑,但以下是我用来简化这一过程的一些策略!
pip 面向 Python 开发者
我的大多数 SQLite 扩展都额外放置在一个小型 Python 库中,并在 PyPi 上分发。Python 开发者随后可以使用如下 pip install 命令安装这些扩展:
pip install sqlite-regex
实际的 Python 库很小,并且旨在与内置的 sqlite3 Python 模块一起使用,如下所示:
import sqlite3
import sqlite_regex
db = sqlite3.connect(':memory:')
db.enable_load_extension(True)
sqlite_regex.load(db)
db.execute("select regex_version(), '[abc]' regexp 'a';").fetchone()
# ('v0.1.0', 1)
请参阅 _Making SQLite extensions pip install-able _(2023 年 2 月)以获取更多详细信息。
npm 面向 Node.js 开发者
这些扩展也在 npm 上分发,供 Node.js 使用。它们可以通过如下 npm install 命令进行安装:
npm install sqlite-regex
然后在 Node.js 程序中使用 better-sqlite3 或 node-sqlite3,如下所示:
import Database from "better-sqlite3";
import * as sqlite_regex from "sqlite-regex";
const db = new Database(":memory:");
db.loadExtension(sqlite_regex.getLoadablePath());
const version = db.prepare("select regex_version()").pluck().get();
console.log(version); // "v0.2.0"
请参阅 Making SQLite extensions npm install'able for Node.js, and on deno.land/x for Deno(2023 年 3 月)以获取更多详细信息。
deno.land/x 面向 Deno 开发者
这些扩展也在 deno.land/x 上分发,供 Deno 程序使用。它旨在与 x/sqlite3 客户端配合使用,方式如下:
import { Database } from "https://deno.land/x/sqlite3@0.8.0/mod.ts";
import * as sqlite_regex from "https://deno.land/x/sqlite_regex@v0.2.3-alpha.2/mod.ts";
const db = new Database(":memory:");
db.enableLoadExtension = true;
sqlite_regex.load(db);
const [version] = db.prepare("select regex_version()").value<[string]>()!;
console.log(version);
请参阅 Making SQLite extensions npm install'able for Node.js, and on deno.land/x for Deno](https://observablehq.com/@asg017/making-sqlite-extensions-npm-installable-and-deno#cell-13)(2023 年 3 月)中的“Deno”部分以获取更多详细信息。
gem 面向 Ruby 开发者
这些扩展也在 rubygems.org 上分发,供 Ruby 应用程序使用。它旨在与 sqlite3 客户端配合使用,如下所示:
require 'sqlite3'
require 'sqlite_regex'
db = SQLite3::Database.new(':memory:')
db.enable_load_extension(true)
SqliteRegex.load(db)
db.enable_load_extension(false)
result = db.execute("select regex_version(), '[abc]' regexp 'a';")
puts result.first.first # "v0.2.3-alpha.7"
puts result.first.last # 1
请参阅 Making SQLite extension gem install'able for Ruby Developers(2023 年 6 月)以获取更多详细信息。
作为 Datasette 插件
这些 SQLite 扩展中的大多数也作为 Datasette 插件 分发。它们是对应的 pip 包 的小型封装。
可以按以下方式安装:
datasette install datasette-sqlite-regex
现在所有未来的 Datasette 实例都将包含 sqlite-regex 函数。这里我们使用 datasette --get 来测试它。
$ datasette --get '/_memory.csv?sql=select+regex_version()'
regex_version()
v0.1.0
作为 sqlite-utils 插件
这些 SQLite 扩展中的大多数也作为 sqlite-utils 插件 分发。它们是对应的 pip 包 的简单封装。
可以按以下方式安装:
sqlite-utils install sqlite-utils-sqlite-regex
现在,当使用 sqlite-utils CLI 时,sqlite-regex 函数将可用。
$ sqlite-utils memory 'select regex_version()'
[{"regex_version()": "v0.2.3"}]
路线图
我计划在未来构建并开源的各种扩展和工具!这些项目的大部分开发都在私有仓库中进行,以便让我更轻松地工作。
如果你对其中任何一个感兴趣,请给我发一条消息!
未来的 SQLite 扩展
sqlite-img:查询和操作图像(裁剪、缩略图、旋转等)sqlite-xml:使用 XPath 字符串查询 XML 文档sqlite-assert:在查询时对你的数据进行断言sqlite-parquet:从 SQLite 查询 Parquet 文件sqlite-md:将 Markdown 文档作为其 AST 进行查询sqlite-geo:一个 GIS 扩展,是 spatialite 的精简替代方案sqlite-python:使用纯 Python 编写可加载的 SQLite 扩展sqlite-qjs:使用 QuickJS 在 JavaScript 中创建自定义标量、聚合和表函数sqlite-duckdb:在 DuckDB 表中查询和插入数据,使用 DuckDB 查询 CSV/Parquet/JSONsqlite-pg:在 Postgres 表中查询和插入数据sqlite-notion:在 Notion 数据库中查询和插入数据sqlite-google-sheets:在 Google Sheet 中查询和插入数据
未来的扩展绑定
- Elixir
- Rust
- Go
未来的工具
sqlite-package-manager:一个用于管理项目中 SQLite 扩展的命令行工具,类似于 npm/pip/brewsqlite-docs:使用CREATE TABLE语句中的行内注释来记录 SQLite 表和列,类似于 JSDoc/rustdoc/docstringssqlitex:一个现代的sqlite3替代方案,一个支持 Parquet/S3 的新 CLI,更大的标准库,语法高亮等