Turso SQLite 离线同步公开 Beta 版发布
Jamie Barton
Pekka Enberg
我们很高兴地宣布 Turso Offline Sync 现已推出公开 Beta 版!
即使与互联网断开连接,您的应用程序也能无缝运行。本地数据库操作可以正常进行,一旦连接恢复,就会自动同步。
一直以来,SQLite 都是一个擅长运行本地嵌入式数据库的数据库,因为它只是一个文件。对于移动设备来说,这意味着设备上的数据库。
Turso 利用 Embedded Replicas 的优势 —— 您本地的嵌入式数据库,无论是在设备上还是服务器上,现在都可以与您的 Turso Cloud 数据库保持同步,并且任何更改都会传播到所有副本。
直到今天,我们的同步还是单向的:虽然您始终可以从数据库读取数据(即使处于离线状态),但写入操作会直接发生在 Cloud 上,并在之后传播。
这带来了两个后果:
- 写入总是受网络速度的限制,因为每次请求都必须联系服务器
- 写入无法在离线状态下工作
随着今天的发布,本地数据库将能够接受像文件一样快的写入,离线工作,并在稍后同步到 Turso Cloud。
#更易于实现的用例
Offline Sync 解锁的一件事是创建设备上的本地优先应用程序的能力(浏览器内的支持计划在未来推出,通过 "the Limbo Project"实现)。本地优先架构允许创建快速响应且能抵抗网络故障的应用程序。
与其他本地优先应用程序相比,Turso 的架构提供了一个更简单的解决方案,因为它总是同步整个数据库。使用 Turso 的多租户架构,您可以控制哪些数据进入哪个数据库(例如,每个用户或每个租户),然后将整个数据库传输到设备。
除了设备上的本地优先应用程序之外,Offline Sync 还简化了许多其他用例:
- 移动应用 —— 创建真正的离线移动体验,包括基于 Expo 的 React Native 应用程序。
- 销售点系统 —— 无论互联网连接如何,都可以处理交易
- 现场数据收集 —— 在偏远地区收集数据,无需担心连接问题
- IoT 应用 —— 维护本地数据存储,并定期与 Turso Cloud 进行云同步
#公开 Beta 版中包含的内容?
以下功能是公开 Beta 版的一部分:
- 双向同步(将本地更改推送到远程并拉取远程更改)
- 对嵌入式副本的远程写入支持
- WAL 同步检查点
- 冲突检测(但尚未实现冲突解决)
#开始使用
现在邀请您试用 Turso Offline Sync。 Beta 版目前包括对 TypeScript 和 Rust 的支持。
请确保在您首选的 AWS 位置创建一个新数据库:
# 在您首选的 AWS 位置创建一个组
turso group create --location aws-us-east-1 offline
# 创建支持离线功能的数据库
turso db create --group offline offline
#TypeScript
请确保安装最新的 @libsql/client
包:
npm install @libsql/client
然后在您的项目中,请确保设置 offline: true
以启用离线模式:
import { createClient } from '@libsql/client';
const client = createClient({
url: 'file:local.db',
syncUrl: process.env.TURSO_SYNC_URL,
authToken: process.env.TURSO_AUTH_TOKEN,
});
// Function to save a note that works offline
async function saveNote(content) {
await client.execute(`
CREATE TABLE IF NOT EXISTS notes (
id INTEGER PRIMARY KEY,
content TEXT,
created_at TEXT
)
`);
// Add the note - works even without internet
await client.execute({
sql: `INSERT INTO notes (content, created_at) VALUES (?, datetime('now'))`,
args: [content],
});
// Try to sync changes with the remote database
try {
await client.sync();
console.log('Note synced to cloud');
} catch (error) {
console.log('Note saved locally, will sync later');
}
}
// Read notes function that works offline
async function getNotes() {
const result = await client.execute(
'SELECT * FROM notes ORDER BY created_at DESC',
);
return result.rows;
}
#Rust
请确保使用 Cargo 安装最新的 libsql crate:
cargo add libsql
以下是如何在 Rust 应用程序中使用它:
use libsql::{Builder, Database, ResultSet, params};
use std::env;
async fn setup_db() -> Result<Database, Box<dyn std::error::Error>> {
let db_path = env::var("LOCAL_DB_PATH").unwrap_or("local.db".to_string());
let sync_url = env::var("TURSO_SYNC_URL").expect("TURSO_SYNC_URL must be set");
let auth_token = env::var("TURSO_AUTH_TOKEN").expect("TURSO_AUTH_TOKEN must be set");
// Create a synced database with offline capabilities
let db = Builder::new_synced_database(db_path, sync_url, auth_token)
.build()
.await?;
let conn = db.connect()?;
conn.execute(
"CREATE TABLE IF NOT EXISTS field_data (
id INTEGER PRIMARY KEY,
location TEXT,
reading REAL,
notes TEXT,
timestamp TEXT
)",
()
).await?;
Ok(db)
}
async fn record_data(db: &Database, location: &str, reading: f64, notes: &str) -> Result<(), Box<dyn std::error::Error>> {
let conn = db.connect()?;
// Insert data locally - works offline
conn.execute(
"INSERT INTO field_data (location, reading, notes, timestamp)
VALUES (?, ?, ?, datetime('now'))",
params![location, reading, notes]
).await?;
println!("Data recorded locally");
// Try to sync with server if possible
match db.sync().await {
Ok(_) => println!("Data synchronized with central database"),
Err(e) => println!("Working offline - data will sync later: {}", e),
}
Ok(())
}
#使用 Expo 的移动应用
对于那些构建本地优先离线应用的开发者,Expo 与 Turso 配合得很好。您可以从 expo-sqlite 开始:
bunx create-expo-app -e with-libsql my-libsql-app
import { SQLiteProvider, useSQLiteContext } from 'expo-sqlite';
export default function App() {
return (
<SQLiteProvider
databaseName="local.db"
onInit={
// Run some optional migration
}
options={{
libSQLOptions: {
url: '...',
authToken: '...',
},
}}
>
<Main />
</SQLiteProvider>
);
}
function Main() {
const db = useSQLiteContext();
return <View>{/* Your offline-first Expo app */}</View>;
}
#下一步是什么?
在您的支持下,我们正在努力开发以下功能:
- 自动和手动冲突解决
- 同步协议带宽优化
- 静态数据加密
您可以在 GitHub 上关注进度。
#感谢
我们要向参与私有 Beta 版的 Turso 社区成员表示衷心的感谢。您的反馈、错误报告和功能建议对于塑造此版本至关重要。
Turso Offline Sync 目前处于 Beta 质量,不建议用于生产环境。在 Beta 期间,没有持久性保证,这意味着可能会丢失数据。
请务必 加入我们的 Discord 以随时了解 Beta 的最新信息并提供反馈。