@broberg/db-sdk (英语)
Broberg.ai舰队共享 数据库客户端 一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一二一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一二一一一一一一一一一一一一一一一一一一一一一一一一一一一一二一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一 运输:
| 运输 | 对于 | 信封默认 |
|---|---|---|
libsql (默认) | Turso / libSQL, 当地 file: 数据库 | TURSO_DATABASE_URL, (中文(简体) ), TURSO_AUTH_TOKEN |
postgres | PostgreSQL,包括Supabase | DATABASE_URL |
createClient() 返回同样的 DbClient 从两者,所以切换运输是
调用时更改为 createClient —— 说 为了连接.
SQL 未被翻译 . 使用 libSQL 选项
?占位符, Postgres 获取$1,这两个方言在DDL,功能和PRAGMA外观 通过未更改的 SQL : 重写?输入$1还会重写一个?在字符串文字或 JSON 操作员中。 在一个应用程序之间移动 运输也意味着移动其SQL.
安装
bun add @broberg/db-sdk
# or: npm i @broberg/db-sdk
使用
import { createClient, createReplica, health } from '@broberg/db-sdk';
// Turso (reads TURSO_DATABASE_URL + TURSO_AUTH_TOKEN)
const db = createClient();
// Postgres / Supabase (reads DATABASE_URL)
const pg = createClient({ backend: 'postgres' });
await pg.execute({ sql: 'insert into notes (id, body) values ($1, $2)', args: [1, 'hej'] });
const { rows } = await pg.execute('select id, body from notes');
// rows: [{ id: 1, body: 'hej' }]
// Several statements in ONE transaction — all apply or none do.
await db.batch([
{ sql: 'delete from s where edge = ?', args: ['m1'] },
{ sql: 'insert into s (edge, name) values (?, ?)', args: ['m1', 'x'] },
], 'write');
await health(pg); // { ok: true, transport: 'postgres', version: '16.4' }
health() 报告运输情况 已回复 - 在那里读,而不是
从你自己的设定中推断出来.
逃生舱
client.raw 驱动程序本身的客户端,每台运算键入,用于
任何表面没有覆盖的:
const pg = createClient({ backend: 'postgres' });
await pg.raw.listen('events', (payload) => { /* … */ }); // postgres.js
const db = createClient();
await db.raw.executeMultiple(script); // @libsql/client
嵌入式复制品(只有libSQL)
本地 SQLite 文件与远程 Turso 主机同步 。 没有
Postgres对应, 和配置类型说: backend: 'postgres' 编号
ReplicaConfig 是一个编译错误.
const edge = createReplica({ path: '/data/buddy.db', syncIntervalSeconds: 30 });
await edge.sync(); // or rely on the interval
苏巴基地
使用鼠标连接字符串作为 DATABASE_URL发言稿
总是关闭 因为他们对Supabase做了些什么
交易-模式池(端口6543)。 2026年9月23日对照真实
Supabase项目(eu-North-1),40项同时询问,并准备以下说明:
| 路线 | 结果 |
|---|---|
| 交易总汇, 6543 | 挂载 5–8 个答案后——无出错,3个运行 3 |
| 会话集合器 | 第40/40号决议 |
| 直接,5432 | 第40/40号决议 |
它不会失败——它 绞刑,而且只在货币下,所以顺序
测试和本地Postgres都保持绿色。 合同套房开60个
在20秒期限内通过真正的集合器同时查询
将准备好的语句转回红色 HUNG。 。 。 .
在服务器上保留服务-作用连接字符串. Supabase auth 属于
@broberg/auth,存储于 @broberg/media; 此软件包是 SQL 连接
只有这个.
机构
ORM留在消费者。 龙虾取出 驱动程序 客户端,你给我
raw数字 :
import { drizzle } from 'drizzle-orm/postgres-js';
const orm = drizzle(createClient({ backend: 'postgres' }).raw, { schema });
API 密码
| 导出 | 签署 |
|---|---|
createClient | (cfg?: LibsqlConfig) => DbClient<LibsqlClient> • 妇女 (cfg: PostgresConfig) => DbClient<Sql> |
createReplica | (cfg: ReplicaConfig) => ReplicaClient - 仅限自由 |
health | (client) => Promise<{ ok, transport, version }> ——如无法到达则投出 |
DbClient数字 : transport, (中文(简体) ), raw, (中文(简体) ), execute(stmt), (中文(简体) ), batch(stmts, mode?), (中文(简体) ), close()。 。 。 .
一个声明是: string 或者说 { sql, args? }。结果是
{ rows, columns, rowsAffected },以行为由列键入的普通对象.
值是驱动器自己的——外观统一了形状,而不是类型. 在同一查询中衡量:
| SQL 值 | 独立 | 邮资 |
|---|---|---|
count(*), (中文(简体) ), bigint | number | string (单位:千美元)'1'(中文(简体) ) |
numeric 编号 : 1.5 字义 | number | string (单位:千美元)'1.5'(中文(简体) ) |
integer | number | number |
timestamptz | string | Date |
jsonb | string | 解析对象 |
Postgres 返回 int8 和数字作为字符串,因为 JS 数字不能持有
在2^53上方的int8,而外观不以同样的理由转换它们——
静态精度损失比可见的字符串更糟糕。 与 Number(...)
你知道范围是安全的。 合同套间是这些,所以一个司机
改变它们变成红色.
batch 模式为 'write' 财务报告和审定财务报表 'deferred'。这里有 没有 'read' 模式(单位:千美元)
libSQL 对照本地文件读取批次被测量为执行 INSERT
邮递员拒绝,只读承诺 仅停留在运输
一个外表可以制造.
从0.1.x迁移
createClient() 用于返回 @libsql/client属于自己的 Client。它现在返回
DbClient。给一个打电话的人带来什么变化 :
execute(string | { sql, args })财务报告和审定财务报表batch(stmts, 'write')—— 说 不变。 。 。 .rows[i]['column']——不变. 位置访问rows[i][0]已删除:行 现在都是普通物体了.lastInsertRowid——从外观上走去(这是一个SQLite概念). 使用client.raw.execute(...),或returning id。 。 。 .- LibSQL 客户端上的其他任何信息 (
executeMultiple, (中文(简体) ),transaction, (中文(简体) ),sync: 到达它通过client.raw。 。 。 . - 滴滴:
drizzle(createClient(), { schema })这个读取器的图案 曾被显示——不再有效,因为细雨想要司机的客户端. 写入drizzle(createClient().raw, { schema }). 为双方计量工作 运输(drizzle-orm/libsql财务报告和审定财务报表drizzle-orm/postgres-js) (中文(简体) ). type Client仍作为被贬值的别名存在DbClient。 。 。 .
哥们apps/server),已知的0.1.x消费者,打字和通过自己的
db-sdk 对照此版本进行测试,没有源变化.
测试
DB_SDK_TEST_PG_URL=postgres://… bun test
一个合同套房运行 不变 涉及LibSQL的案件(当地档案),a
真实 邮资,以及——何时 DB_SDK_TEST_PG_POOLER_URL 已经设定——一个真实的
Supabase 交易池。 无 DB_SDK_TEST_PG_URL 套房失败而不是
跳过 Postgres —— 跳过运输读取为绿色 。 CI提供
邮递服务集装箱.
许可证
FSL-1.1-Apache-2.0 克里斯蒂安·布罗伯格