Tauri 是一个构建跨平台桌面应用程序的框架,利用 Web 技术构建前端,并使用 Rust 构建后端。它以其小巧的体积和高性能受到开发者的欢迎。在开发过程中,我们常常需要数据本地持久化, 所以会需要与本地数据库进行交互 。
在 Tauri 中集成本地数据库有多种方案,常见的包括:
优点:
缺点:
优点:
缺点:
优点:
缺点:
综合考虑,我们选择 tauri-plugin-sql-api 作为集成本地数据库的方案。它的集成简单、支持多种数据库类型,并且与 Tauri 框架深度整合,能够有效地提升开发效率和安全性。
此插件要求 Rust 版本至少为 1.65。
我们推荐以下三种通用的安装方法:
在你的 Cargo.toml 文件中添加以下内容:
src-tauri/Cargo.toml
toml
复制代码
[dependencies.tauri-plugin-sql]
git = "https://github.com/tauri-apps/plugins-workspace"
branch = "v1"
features = ["sqlite"] # 或者 "postgres", 或 "mysql"
你可以使用你喜欢的 JavaScript 包管理器来安装:
注意:由于大多数 JavaScript 包管理器无法从 git 单仓库安装包,我们提供了每个插件的只读镜像。这使得安装选项 2 更加方便使用。
pnpm add https://github.com/tauri-apps/tauri-plugin-sql#v1
# 或
npm add https://github.com/tauri-apps/tauri-plugin-sql#v1
# 或
yarn add https://github.com/tauri-apps/tauri-plugin-sql#v1
构建db核心类,初始化DB,这里只是做的key-value的表
import Database from "tauri-plugin-sql-api";
import {ENV_MODE} from "@/utils/const"
class DatabaseService {
private db!: Database;
private dbReady: Promise<void>;
constructor() {
this.dbReady = this.initDatabase();
}
private async initDatabase() {
try {
this.db = await Database.load(ENV_MODE !== 'development' ? "sqlite:xtools.db" : "sqlite:xtools_test.db");
await this.db.execute(`
CREATE TABLE IF NOT EXISTS key_value (
key TEXT PRIMARY KEY,
value TEXT
)
`);
} catch (error) {
console.error("Error initializing database:", error);
throw error;
}
}
public async getDbInstance(): Promise<Database> {
await this.dbReady;
return this.db;
}
}
export default new DatabaseService();
keyValue的增删改查,方便外部使用
import DatabaseService from './dbService';
class KeyValueStore {
private dbPromise = DatabaseService.getDbInstance();
public async set(key: string, value: string): Promise<void> {
const db = await this.dbPromise;
try {
await db.execute('REPLACE INTO key_value (key, value) VALUES (?, ?)', [key, value]);
} catch (error) {
console.error(`Error setting value for key "${key}":`, error);
throw error;
}
}
public async get(key: string): Promise<string | null> {
const db = await this.dbPromise;
try {
const result = await db.select<{ value: string }[]>('SELECT value FROM key_value WHERE key = ?', [key]);
return result.length > 0 ? result[0].value : null;
} catch (error) {
console.error(`Error getting value for key "${key}":`, error);
throw error;
}
}
public async delete(key: string): Promise<void> {
const db = await this.dbPromise;
try {
await db.execute('DELETE FROM key_value WHERE key = ?', [key]);
} catch (error) {
console.error(`Error deleting key "${key}":`, error);
throw error;
}
}
public async getAll(): Promise<{ key: string; value: string }[]> {
const db = await this.dbPromise;
try {
const result = await db.select<{ key: string; value: string }[]>('SELECT key, value FROM key_value');
return result;
} catch (error) {
console.error("Error getting all key-value pairs:", error);
throw error;
}
}
}
export default KeyValueStore;
这里判断了一下环境,如何是TAURI环境我们就用本地数据库,否则就用localStorage,兼容浏览器环境。
import { KeyValueStore } from '@/db';
import {IS_TAURI} from '@/utils/const'
export const getStore = async (key:string) => {
if (IS_TAURI) {
const store = new KeyValueStore();
const val = await store.get(key);
return val
} else {
return localStorage.getItem(key)
}
}
export const setStore = async (key:string,value:string) => {
if (IS_TAURI) {
const store = new KeyValueStore();
await store.set(key,value);
} else {
localStorage.setItem(key,value)
}
}
通过以上步骤,我们在 Tauri 应用中成功集成了 tauri-plugin-sql-api 插件,实现了与本地 SQLite 数据库的交互。tauri-plugin-sql-api 插件不仅支持 SQLite,还支持其他类型的数据库,如 MySQL 和 PostgreSQL,开发者可以根据需求进行选择。通过 Tauri 的这种插件化设计,使得开发者能够轻松地将强大的 Rust 后端功能集成到现代前端框架中,从而构建高性能的跨平台桌面应用程序。
https://github.com/Xutaotaotao/XTools/tree/feature-tauri-v1/src/db