Jamie BartonJamie Barton Pekka EnbergPekka Enberg Cover image for Offline Sync Public Beta

我们很高兴地宣布 Turso Offline Sync 现已推出公开 Beta 版!

即使与互联网断开连接,您的应用程序也能无缝运行。本地数据库操作可以正常进行,一旦连接恢复,就会自动同步。

一直以来,SQLite 都是一个擅长运行本地嵌入式数据库的数据库,因为它只是一个文件。对于移动设备来说,这意味着设备上的数据库。

Turso 利用 Embedded Replicas 的优势 —— 您本地的嵌入式数据库,无论是在设备上还是服务器上,现在都可以与您的 Turso Cloud 数据库保持同步,并且任何更改都会传播到所有副本。

直到今天,我们的同步还是单向的:虽然您始终可以从数据库读取数据(即使处于离线状态),但写入操作会直接发生在 Cloud 上,并在之后传播。

这带来了两个后果:

随着今天的发布,本地数据库将能够接受像文件一样快的写入,离线工作,并在稍后同步到 Turso Cloud。

#更易于实现的用例

Offline Sync 解锁的一件事是创建设备上的本地优先应用程序的能力(浏览器内的支持计划在未来推出,通过 "the Limbo Project"实现)。本地优先架构允许创建快速响应且能抵抗网络故障的应用程序。

与其他本地优先应用程序相比,Turso 的架构提供了一个更简单的解决方案,因为它总是同步整个数据库。使用 Turso 的多租户架构,您可以控制哪些数据进入哪个数据库(例如,每个用户或每个租户),然后将整个数据库传输到设备。

除了设备上的本地优先应用程序之外,Offline Sync 还简化了许多其他用例:

#公开 Beta 版中包含的内容?

以下功能是公开 Beta 版的一部分:

#开始使用

现在邀请您试用 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 的最新信息并提供反馈。