Skip to content

SQLite 设计

灵动桌面框架使用 SQLite 作为本地数据库,通过 rusqlite 库操作。

为什么选择 SQLite

  • 零配置 — 无需安装数据库服务
  • 文件级存储 — 单个 .db 文件,随应用一起分发
  • 性能优秀 — 单用户桌面应用场景下性能极佳
  • 可靠性 — ACID 事务保证数据完整性

数据库初始化

rust
// src-tauri/src/database/mod.rs
use rusqlite::Connection;
use std::sync::Mutex;

pub struct Database {
    conn: Mutex<Connection>,
}

impl Database {
    pub fn new(app_dir: &std::path::Path) -> Result<Self, AppError> {
        let db_path = app_dir.join("app.db");
        let conn = Connection::open(&db_path)?;

        // 启用 WAL 模式(提升并发性能)
        conn.execute_batch("PRAGMA journal_mode=WAL;")?;

        let db = Self {
            conn: Mutex::new(conn),
        };

        // 执行 Schema 迁移
        db.migrate()?;

        Ok(db)
    }
}

全局状态注册

rust
// src-tauri/src/lib.rs
let app_dir = app.path().app_data_dir()?;
std::fs::create_dir_all(&app_dir)?;

let database = Database::new(&app_dir)?;
let app_state = AppState::new(database);

app.manage(app_state);

表设计规范

  • 主键使用 INTEGER PRIMARY KEY AUTOINCREMENT
  • 时间字段使用 TEXT,存储 ISO 8601 格式
  • 字符串字段默认 NOT NULL DEFAULT ''
  • 每张表包含 created_atupdated_at
sql
CREATE TABLE IF NOT EXISTS app_config (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    key         TEXT NOT NULL UNIQUE,
    value       TEXT NOT NULL DEFAULT '',
    created_at  TEXT NOT NULL DEFAULT (datetime('now', 'localtime')),
    updated_at  TEXT NOT NULL DEFAULT (datetime('now', 'localtime'))
);

基于 Tauri 2.x 构建的企业级桌面应用开发框架