
libSQL API 实战指南基于 SQLite 的嵌入式复制数据库客户端库【免费下载链接】libsqllibSQL is a fork of SQLite that is both Open Source, and Open Contributions.项目地址: https://gitcode.com/GitHub_Trending/li/libsqllibSQL API 是构建在 SQLite 之上的开箱即用batteries-included嵌入式 SQL 数据库引擎客户端库其核心价值在于在保持 SQLite 生态SQL 方言、扩展机制兼容的同时为应用提供透明、可嵌入的复制能力。本文以仓库根目录的 README-libsql.md 为骨架结合 libsql crate 的源码与示例系统讲解 libSQL API 的四种数据库形态本地库、远端库、嵌入式副本、离线同步库、Rust 上手流程、其他语言绑定现状以及 feature flag 的裁剪策略帮助你快速在自己的应用中落地本地读 远端写的复制架构。libSQL API 是什么libSQL is an embeddable SQL database engine based on SQLite.This libSQL API is an experimental, batteries-included library built on top of SQLite to support replication while retaining compatibility with the SQLite ecosystem, such as the SQL dialect and extensions.libSQL 是 SQLite 的一个开源分支fork而 libSQL API 是官方提供的客户端库层它以 Rust cratelibsql为核心实现对上层屏蔽本地文件、远端 HTTP、复制日志等底层差异向应用暴露统一的异步 API。这一点在 crate 的模块级文档libsql/src/lib.rs中有更完整的表述This Rust API is a batteries-included wrapper around the SQLite C API to support transparent replication while retaining compatibility with the SQLite ecosystem. If you are building an application in Rust, this is the crate you should use.也就是说libSQL API 并不是一套全新的 SQL 引擎而是SQLite C API 的 Rust 封装 复制协议客户端因此你现有的 SQLite 知识SQL 方言、sqlite_master、扩展加载等可以原样迁移。核心特性按 README-libsql.md 的 Features 一节libSQL API 的能力可以概括为两点嵌入式副本Embedded replicas允许你在应用进程内持有远端数据库的本地副本将数据搬到应用的内存空间/本地磁盘附近以换取低延迟读取。副本可以持续从主库拉取增量写入则转发给远端主库可配置为读己之写模式。多语言支持官方提供Rust、JavaScript、Python、Go、C等语言的绑定。其中 Rust 绑定即本仓库内的libsqlcrate其他语言绑定分别维护在独立的配套仓库中详见下文多语言绑定一节。从实现层面看嵌入式副本在 libsql/src/database/builder.rs 中被细分为多种Database变体这是理解整个 API 设计的关键后文逐一展开。快速上手Rust 三步走在Cargo.toml中加入依赖libsql { version *, default-features false, features [core, replication, remote] }按 crate 文档libsql/src/lib.rs的引导使用方式非常直观先创建Database对象再通过connect()打开Connection最后用异步方法执行 SQLuse libsql::Builder; let db Builder::new_local(:memory:).build().await.unwrap(); let conn db.connect().unwrap(); conn.execute(CREATE TABLE IF NOT EXISTS users (email TEXT), ()).await.unwrap(); conn.execute(INSERT INTO users (email) VALUES (aliceexample.org), ()).await.unwrap();这里的Builder是统一入口Builder::new_local只是其中一种构造方式。从源码libsql/src/database/builder.rs可以看到Builder实际提供了五种形态的数据库Builder 构造器对应形态行为说明new_local(path)本地数据库纯本地文件/内存库无任何网络行为new_remote_replica(path, url, token)远程嵌入式副本本地存副本从远端同步写转发给远端主库new_local_replica(path)本地副本通过sync_frames从本地快照文件同步new_synced_database(path, url, token)离线同步库支持离线写入再批量同步到远端new_remote(url, token)远端数据库不建本地库所有查询经 HTTPHRANA 协议发往远端Connection对象则是统一的执行入口其公开 API 定义在 libsql/src/connection.rs主要包括execute(sql, params)执行写语句返回受影响行数query(sql, params)执行查询返回可迭代的Rowsexecute_batch/execute_transactional_batch批量执行多条语句后者包在原子事务中prepare预编译缓存语句返回Statementtransaction/transaction_with_behavior开启事务默认Deferred模式interrupt、busy_timeout、changes、last_insert_rowid等 SQLite 常用辅助方法。参数既可以传数组[42, baz]也可以使用params!宏见 libsql/src/params.rs两种方式都实现了IntoParamstrait。多语言绑定Rust 之外的选择README 的 Getting Started 一节给出了各语言入口Rust本仓库libsqlcrate见 libsql/README.mdC仓库内的 bindings/cREADME 标注为wip处于开发中状态包含基于cbindgen的头文件生成配置bindings/c/cbindgen.toml与示例程序 bindings/c/example.cJavaScript / Python / Go分别由官方维护在独立的实验性仓库libsql-experimental-node、libsql-experimental-python、go-libsql它们本质上都是对本文 Rust crate 的再绑定。需要说明的是这些非 Rust 绑定在多数场景下能力滞后于 Rust 主 crate若你的项目语言是 Rust直接使用libsqlcrate 能获得最完整、最新的功能面。嵌入式副本Embedded Replicas深入README 将其定位为运行在应用进程内、持有远端数据库本地副本的 libSQL 数据库适用场景是把数据放到应用内存附近以实现快速访问。源码层面嵌入式副本对应DbType::Sync见 libsql/src/database.rs由 libsql/src/database/builder.rs 的BuilderRemoteReplica构建。创建远程嵌入式副本仓库内的 libsql/examples/replica.rs 给出了完整可运行示例use libsql::{Builder, Cipher, EncryptionConfig}; use std::time::Duration; let auth_token std::env::var(LIBSQL_AUTH_TOKEN).unwrap_or_default(); let url std::env::var(LIBSQL_URL) .unwrap_or_else(|_| http://localhost:8080.to_string()) .replace(libsql, https); let db Builder::new_remote_replica(db_file, url, auth_token) .build() .await .unwrap(); let conn db.connect().unwrap(); let f db.sync().await.unwrap(); // 首次全量同步 println!(inital sync complete, frame no: {f:?}); conn.execute(CREATE TABLE IF NOT EXISTS foo (x TEXT), ()).await.unwrap(); db.sync().await.unwrap(); // 把本地写推送到主库 loop { tokio::select! { _ tokio::time::sleep(Duration::from_secs(1)) { let r db.sync().await.unwrap(); // 周期拉取增量 println!(replicated until index {r:?}); } // ... } }关键配置项BuilderRemoteReplica在 libsql/src/database/builder.rs 中暴露了以下方法read_your_writes(bool)是否让本地写操作在返回前就对本地可见默认true。设为true时你写完后立刻能读到自己的写入sync_interval(Duration)让复制器在后台按固定周期自动调用sync该后台任务随Database对象存活Database被 drop 时自动停止实现见 libsql/src/database/builder.rsencryption_config(EncryptionConfig)对本地副本进行静态加密需要启用encryptionfeature详见下文connector(C)注入自定义 HTTP connector实现tower::Servicehttp::Uri用于替代内置 TLS 连接器namespace(String)通过 HTTP 头向远端传达命名空间多租户场景http_request_callback(F)在每个 HTTP 请求发出前回调可修改请求头或 URIunsafe skip_safety_assert(bool)跳过 SQLite SERIALIZED 线程安全模式断言非常危险仅在确实与其他 SQLite 使用冲突时按 SQLite 线程规则自担风险使用。同步 APIDatabase在 libsql/src/database.rs 提供了一组复制相关方法sync()从远端拉取并应用复制帧返回Replicated含frame_no()与frames_synced()前者可被服务端重置、后者用于统计本次同步帧数一帧为 4KB 的 WAL 帧sync_until(index)一直同步到指定的复制序号sync_frames(frames)手动应用一批帧供本地副本使用flush_replicator()强制把缓冲的复制帧应用掉replication_index()当前已提交的复制序号freeze()把嵌入式副本冻结为普通本地数据库非副本模式用于下线副本场景max_write_replication_index()本Database所有连接写入后返回的最大复制序号。本地副本Local Replica若你的复制源不在远端而在本地文件系统如磁盘上的快照文件可用Builder::new_local_replica。README 中的示例libsql/src/lib.rs展示了基本用法use libsql::Builder; use libsql::replication::Frames; let mut db Builder::new_local_replica(/tmp/test.db).build().await.unwrap(); let frames Frames::Vec(vec![]); db.sync_frames(frames).await.unwrap(); let conn db.connect().unwrap(); conn.execute(SELECT * FROM users, ()).await.unwrap();libsql/examples/local_sync.rs 则演示了完整场景从快照目录读取SnapshotFile用Frames::Snapshot(snapshot)应用到本地库并支持通过http_request_callback自定义后续写转发的请求。注意嵌入式副本要求目标路径上是干净数据库不存在文件或此前已同步过的数据库否则会直接报错以防误用遇到该错误时删除数据库文件并让其重新同步、重建wal_index元数据文件即可见 libsql/src/database/builder.rs 的 Note。远端数据库纯 HTTP 访问模式如果不希望落任何本地文件可以用Builder::new_remote创建纯远端连接对应DbType::Remotelibsql/src/database.rs。README 示例libsql/src/lib.rsuse libsql::Builder; let db Builder::new_remote(libsql://my-remote-db.com.to_string(), my-auth-token.to_string()) .build().await.unwrap(); let conn db.connect().unwrap(); conn.execute(CREATE TABLE IF NOT EXISTS users (email TEXT), ()).await.unwrap(); conn.execute(INSERT INTO users (email) VALUES (aliceexample.org), ()).await.unwrap();从实现看connect()在远端模式下不调用任何 C FFI而是惰性创建到远端的 HTTP 连接见 libsql/src/database.rs实际走的是 libsql 的 HRANA 协议crate::hrana::connection::HttpConnection见 libsql/src/hrana/connection.rs。URL 使用libsql://前缀token 作为 Bearer 认证头发送。关于 WASM值得说明的是由于 WASM 要求!Send支持而Database类型基于async_trait抽象了多种数据库形态因此Database无法直接用于 WASM。仓库为此在wasm模块提供了更简化的并行类型以在 WASM 环境访问远端 HTTP 协议见 libsql/src/lib.rs 与 libsql/src/wasm。离线写入Synced DatabaseBuilder::new_synced_database提供可离线写入、稍后同步到远端的形态DbType::Offlinelibsql/src/database.rs。libsql/examples/offline_writes.rs 演示了完整流程构建 → 首次db.sync()拉取远端数据 → 本地建表/插入 → 再次db.sync()把本地变更推回远端。该形态的关键方法包括remote_writes(bool)是否把本地写实时转发给远端主库read_your_writes(bool)同上控制本地写可见性set_push_batch_size(u32)批量推送的大小sync_interval(Duration)后台自动同步周期。当sync_interval被设置时build()会启动一个后台任务周期执行try_pullremote_writes 模式或sync_offline离线模式并通过DropAbort在Database被 drop 时优雅停止见 libsql/src/database/builder.rs。Feature Flags按需裁剪依赖libsqlcrate 通过 feature flag 控制依赖规模帮助你显著缩短编译时间详见 libsql/src/lib.rs 与 libsql/Cargo.tomlFeature作用core引入核心 C 代码libsql-sys支撑本地库与嵌入式副本的基础能力replication包含core外加复制/同步所需的 HTTP 代码支持远端同步到本地remote仅含 HRANA HTTP 客户端代码用于对远端数据库执行查询sync依赖remotereplication提供离线写入与后台同步能力tls使用内置hyper-rustlsTLS 连接器关闭后所有需要 HTTP 的 feature 都必须由你传入自定义 connectorencryption开启静态加密Cipher、EncryptionConfig见 libsql/examples/encryption_local.rs 等示例wasm/cloudflareWASM 与 Cloudflare Workers 场景支持serde/parser/stream反序列化de模块、SQL 解析与流式读取等附属能力默认情况下所有 feature 均开启default [core, replication, remote, sync, tls]通过default-features false可关闭默认集合再按需显式声明。例如纯 HTTP 客户端场景可以这样裁剪libsql { version *, default-features false, features [remote] }从源码libsql/src/database.rs可以看到当tls被关闭而你又未提供自定义 connector 时connector()会直接panic!提醒必须自行注入 HTTP connector——这是裁剪 feature 时必须注意的约束。小结围绕 README-libsql.md 的定位libSQL API 用一套统一的Database/Connection抽象覆盖了五种使用形态本地内存/文件库、远端纯 HTTP 库、远程嵌入式副本、本地快照副本与离线同步库。无论你的诉求是进程内低延迟副本断网可写还是多语言复用都能在保持 SQLite 兼容性的前提下找到对应配置。进一步阅读可以参考仓库内的 libsql/examples 下的 12 个示例覆盖加密、离线写、远程同步、事务、反序列化等、libsql/src 的模块源码以及 crate 级文档 libsql/README.md。本项目遵循 MIT 协议见仓库根目录 LICENSE.md对外贡献默认以 MIT 条款授权。【免费下载链接】libsqllibSQL is a fork of SQLite that is both Open Source, and Open Contributions.项目地址: https://gitcode.com/GitHub_Trending/li/libsql创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考