ITADN
asg017/sqlite-ecosystem
asg017/sqlite-ecosystem · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

sqlite-ecosystem

我(Alex Garcia 👋🏼)编写并开源的所有 SQLite 扩展、工具和指南。

欢迎在此仓库中发起关于 SQLite 扩展和工具元层面的讨论!但如果您在某个特定扩展或工具上遇到具体问题,请在该项目的仓库中提交 issue。

概述

以下是我构建的所有可加载 SQLite 扩展,以及它们所使用的编程语言和分发渠道。

扩展描述语言PythonNode.jsDenoRubyDatasettesqlite-utils
sqlite-http发起 HTTP 请求Go
sqlite-html解析 HTML 文档Go
sqlite-lines逐行读取文件/二进制大对象C
sqlite-path解析和生成文件路径C
sqlite-url解析和生成 URLC
sqlite-xsv查询 CSV 文件Rust🚧🚧
sqlite-regex正则表达式函数Rust
sqlite-ulid处理 ULIDRust
sqlite-jsonschema使用 JSON Schema 验证 JSON 对象Rust
sqlite-fastrand快速生成快速数字/数据块Rust
sqlite-vssSQLite 中的向量搜索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';
语言/平台安装
Pythonpip install sqlite-httpPyPI
Node.jsnpm install sqlite-httpnpm
Denodeno.land/x/sqlite_httpdeno.land/x release
Datasettedatasette install datasette-sqlite-httpPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-httpPyPI
Rubygem install sqlite-httpGem
Github ReleaseGitHub tag (latest SemVer pre-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>"
语言/平台安装
Pythonpip install sqlite-htmlPyPI
Node.jsnpm install sqlite-htmlnpm
Denodeno.land/x/sqlite_htmldeno.land/x release
Datasettedatasette install datasette-sqlite-htmlPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-htmlPyPI
Rubygem install sqlite-htmlGem
Github ReleaseGitHub tag (latest SemVer pre-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');
语言/平台安装
Pythonpip install sqlite-linesPyPI
Node.jsnpm install sqlite-linesnpm
Denodeno.land/x/sqlite_linesdeno.land/x release
Datasettedatasette install datasette-sqlite-linesPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-linesPyPI
Rubygem install sqlite-linesGem
Github ReleaseGitHub tag (latest SemVer pre-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'
语言/平台安装
Pythonpip install sqlite-pathPyPI
Node.jsnpm install sqlite-pathnpm
Denodeno.land/x/sqlite_pathdeno.land/x release
Datasettedatasette install datasette-sqlite-pathPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-pathPyPI
Rubygem install sqlite-pathGem
Github ReleaseGitHub tag (latest SemVer pre-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'
语言/平台安装
Pythonpip install sqlite-urlPyPI
Node.jsnpm install sqlite-urlnpm
Denodeno.land/x/sqlite_urldeno.land/x release
Datasettedatasette install datasette-sqlite-urlPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-urlPyPI
Rubygem install sqlite-urlGem
Github ReleaseGitHub tag (latest SemVer pre-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');
语言/平台安装
Pythonpip install sqlite-xsvPyPI
Node.jsnpm install sqlite-xsvnpm
Denodeno.land/x/sqlite_xsvdeno.land/x release
Rubygem install sqlite-xsvGem
Github ReleaseGitHub tag (latest SemVer pre-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 │
└───────┴───────┴─────┴───────────────┘
*/
语言/平台安装
Pythonpip install sqlite-regexPyPI
Node.jsnpm install sqlite-regexnpm
Denodeno.land/x/sqlite_regexdeno.land/x release
Datasettedatasette install datasette-sqlite-regexPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-regexPyPI
Rubygem install sqlite-regexGem
Github ReleaseGitHub tag (latest SemVer pre-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'
语言/平台安装
Pythonpip install sqlite-ulidPyPI
Node.jsnpm install sqlite-ulidnpm
Denodeno.land/x/sqlite_uliddeno.land/x release
Datasettedatasette install datasette-sqlite-ulidPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-ulidPyPI
Rubygem install sqlite-ulidGem
Github ReleaseGitHub tag (latest SemVer pre-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
语言/平台安装
Pythonpip install sqlite-jsonschemaPyPI
Node.jsnpm install sqlite-jsonschemanpm
Denodeno.land/x/sqlite_jsonschemadeno.land/x release
Datasettedatasette install datasette-sqlite-jsonschemaPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-jsonschemaPyPI
Rubygem install sqlite-jsonschemaGem
Github ReleaseGitHub tag (latest SemVer pre-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
语言/平台安装
Pythonpip install sqlite-fastrandPyPI
Node.jsnpm install sqlite-fastrandnpm
Denodeno.land/x/sqlite_fastranddeno.land/x release
Datasettedatasette install datasette-sqlite-fastrandPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-fastrandPyPI
Rubygem install sqlite-fastrandGem
Github ReleaseGitHub tag (latest SemVer pre-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;
语言/平台安装
Pythonpip install sqlite-vssPyPI
Node.jsnpm install sqlite-vssnpm
Denodeno.land/x/sqlite_vssdeno.land/x release
Datasettedatasette install datasette-sqlite-vssPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-vssPyPI
Rubygem install sqlite-vssGem
Github ReleaseGitHub tag (latest SemVer pre-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!'
语言/平台安装
Pythonpip install sqlite-helloPyPI
Node.jsnpm install sqlite-hellonpm
Denodeno.land/x/sqlite_hellodeno.land/x release
Datasettedatasette install datasette-sqlite-helloPyPI
sqlite-utilssqlite-utils install sqlite-utils-sqlite-helloPyPI
Rubygem install sqlite-helloGem
Github ReleaseGitHub tag (latest SemVer pre-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-sqlite3node-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/JSON
  • sqlite-pg:在 Postgres 表中查询和插入数据
  • sqlite-notion:在 Notion 数据库中查询和插入数据
  • sqlite-google-sheets:在 Google Sheet 中查询和插入数据

未来的扩展绑定

  • Elixir
  • Rust
  • Go

未来的工具

  • sqlite-package-manager:一个用于管理项目中 SQLite 扩展的命令行工具,类似于 npm/pip/brew
  • sqlite-docs:使用 CREATE TABLE 语句中的行内注释来记录 SQLite 表和列,类似于 JSDoc/rustdoc/docstrings
  • sqlitex:一个现代的 sqlite3 替代方案,一个支持 Parquet/S3 的新 CLI,更大的标准库,语法高亮等