依赖安装

根据官方文档,添加 tauri-plugin-sql 依赖

tauri-plugin-sql = { version = "2", features = ["sqlite"] }
sqlx = {version = "0.8", features = ["runtime-tokio-rustls", "sqlite"] }

插件底层查询引擎使用的是 sqlx, 如果你需要在 Rust 中使用 Sqlite, 也需要添加这个依赖。

安装 @tauri-apps/plugin-sql , 用于在 JavaScript 中使用 Sql 数据库

 "@tauri-apps/plugin-sql": "^2.2.0",

初始化数据库

推荐使用 Sqlite migrations 来管理数据库变动

Migrations

  • Migrations 是数据库架构演进的管理工具
  • 它允许你以版本化的方式管理数据库结构的变更
  • 每个 migration 都有一个版本号、描述和对应的 SQL 语句

创建 Migrations

新建 migrations 目录,用于存放数据库变动的 SQL 文件 ,初始化数据库操作,我们新建 migrations/v1_init.sql, 例如下面的代码

-- Create gists table
CREATE TABLE gists (
    id TEXT PRIMARY KEY,           -- Gist 的唯一标识
    node_id TEXT NOT NULL,
    url TEXT NOT NULL,
    comments_url TEXT NOT NULL,
    description TEXT,              -- Gist 描述
    public BOOLEAN DEFAULT 0,      -- 是否公开
    owner_login TEXT,              -- 创建者用户名
    created_at DATETIME,           -- 创建时间
    updated_at DATETIME,           -- 最后更新时间
    sync_at DATETIME,             -- 本地最后同步时间
    sync_status TEXT DEFAULT 'init' CHECK(sync_status IN ('init', 'synced', 'pending_update'))
);
 
-- Create indexes for gists table
CREATE INDEX idx_gists_owner_login ON gists(owner_login);
CREATE INDEX idx_gists_sync_status ON gists(sync_status);
CREATE INDEX idx_gists_updated_at ON gists(updated_at);
 
-- Create gist_files table
CREATE TABLE gist_files (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    gist_id TEXT,                   -- 关联的 Gist ID
    type TEXT,                      -- 文件类型
    filename TEXT NOT NULL,         -- 文件名
    language TEXT,                  -- 编程语言
    raw_url TEXT,                   -- 文件原始地址
    content TEXT,                   -- 文件内容
    size INTEGER,                   -- 文件大小
    FOREIGN KEY(gist_id) REFERENCES gists(id) ON DELETE CASCADE
);
 
-- Create indexes for gist_files table
CREATE INDEX idx_gist_files_gist_id ON gist_files(gist_id);
CREATE INDEX idx_gist_files_language ON gist_files(language);
 

使用 Migrations 初始化

fn main() {
    let migrations = vec![
        Migration {
            version: 1,
            description: "init sqlite table",
            sql: include_str!("../migrations/v1_init.sql"),
            kind: MigrationKind::Up,
        },
    ];
 
    tauri::Builder::default()
        .plugin(
            tauri_plugin_sql::Builder::default()
                .add_migrations("sqlite:xgist.db", migrations)
                .build(),
        )
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

.add_migrations 的第一个参数是数据库的名称,一般为 sqlite:[name].db 的格式

设置 tauri.conf.json

{
  "plugins": {
    "sql": {
      "preload": ["sqlite:xgist.db"]
    }
  }
}

这段代码会在插件初始时自动执行 v1_init.sql, 创建两张数据表,同时会创建一个 _sqlx_migrations 表,在其中记录已经执行了哪个版本的 migration

使用 Migrations 进行更新

如果后续我们需要对表进行一些改动,例如新增字段或者新增数据表,需要再新创建一个 Migrationversion 设置为2(或者其他,需要是唯一值), 在 Migration
添加改动的 sql 代码,例如需要在表中新增 count 字段, 在 migrations 目录下新建 v2_add_count.sql

ALTER TABLE gist_files ADD COLUMN count INIT NOT NULL DEFAULT 0;

然后在 Migration 中添加

let migrations = vec![
    Migration {
        version: 1,
        description: "create initial schema",
        sql: include_str!("../migrations/v1__init.sql"),
        kind: MigrationKind::Up,
    },
    Migration {
        version: 2,
        description: "add count to gist_files",
        sql: include_str!("../migrations/v2__add_count.sql"),
        kind: MigrationKind::Up,
    }
];

这样当一个应用发布后,用户启动应用时,如果是老用户,则会自动执行 v2_add_count.sql,更新数据库结构,因为 _sqlx_migrations 表中已经记录了用户执行过哪些 migration
对于新安装的用户,由于没有对应的执行记录,所以会先执行 version: 1 ,在执行 version: 2Migration, 这样确保了老用户的数据库升级而不会影响到现有数据

验证数据库是否创建成功

在完成上面的步骤后,重新执行 tauri 运行, 如果没有报错,则说明大概率是成功了,此时我们需要验证是否真的成功了,首先需要找到我们创建的 sqlite:xgist.db 的位置

macOs上

macOs 系统上,db 文件的位置在

/Users/[name]/Library/Application\ Support/[app-name]/[db-name].db
  • [app-name]: tauri.conf.json 中的 identifier 字段
  • [db-name]: 你所定义的 Sqlite 数据库名称

找到 db 文件位置之后你就可以通过一些工具来查看了

Sqlite3 命令行工具

安装 Sqlite3

brew install sqlite3

进入 sqlite 数据库环境

sqlite3 /Users/[name]/Library/Application\ Support/[app-name]/[db-name].db

成功后执行 .table 查看数据库中的表

第三方 GUI 工具

选择你喜欢的使用第三方 GUI 工具能更清晰的查看数据库内容,以 TablePlus 为例,点击新建连接,选择 Sqlite


添加自定义 Name, 将上面我们找到的db 路径复制到 Database Path 中,点击 Connect 就可以了
tableplus