You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tauri+Vue项目中SQLite文件连接失败,表不存在问题求助

Tauri+Vue中tauri-plugin-sql SQLite表不存在问题解决

核心原因

你遇到的no such table: barbers本质是连接到了错误的数据库文件(大概率是空的新文件),因为SQLite路径的配置逻辑没搞对。

路径对应关系说明

  • Vue项目目录属于前端WebView资源,直接用相对路径无法访问本地系统的SQLite文件,且WebView的路径解析和本地文件系统完全不同。
  • src-tauri是Rust后端代码目录,编译后二进制文件的位置会变化,直接把数据库放这里或用相对路径指向这里,打包后会失效。

正确的文件存放位置与路径写法

1. 数据库文件的标准存放位置

必须放在Tauri提供的应用专属数据目录,不同系统的路径示例:

  • Windows: C:\Users\<用户名>\AppData\Roaming\<你的应用名>
  • macOS: ~/Library/Application Support/<你的应用名>
  • Linux: ~/.config/<你的应用名>

这个目录由Tauri的路径API自动获取,开发和打包后都能稳定访问。

2. Rust端(main.rs)的正确配置

用Tauri的path API动态获取目录,初始化数据库连接:

use tauri::{api::path::data_dir, Manager};
use tauri_plugin_sql::Builder;

fn main() {
    tauri::Builder::default()
        .setup(|app| {
            // 获取应用专属数据目录
            let app_data_dir = data_dir()
                .unwrap()
                .join(app.package_info().name.clone());
            // 确保目录存在
            std::fs::create_dir_all(&app_data_dir).unwrap();
            // 拼接数据库文件路径
            let db_path = app_data_dir.join("barbers.db");

            // 开发阶段:如果项目中有现成的数据库文件,复制到数据目录(可选)
            let source_db = app.path_resolver()
                .resolve_resource("barbers.db")
                .unwrap();
            if !db_path.exists() {
                std::fs::copy(&source_db, &db_path).unwrap();
            }

            // 初始化数据库连接
            let db = Builder::default()
                .add("sqlite", db_path.to_str().unwrap())
                .build()
                .unwrap();
            app.manage(db);
            Ok(())
        })
        .plugin(tauri_plugin_sql::init())
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

注:如果要在开发阶段使用项目中的barbers.db,把文件放在src-tauri/resources目录下,这样resolve_resource能正确找到。

3. 前端DatabaseService的调用方式

前端不需要处理路径,直接通过Rust注册的数据库别名(比如上面的sqlite)调用:

// DatabaseService.js/ts
import { Database } from 'tauri-plugin-sql-api';

let db;

export async function initDB() {
    // 通过别名连接已经在Rust端初始化好的数据库
    db = await Database.load('sqlite:');
}

export async function getBarbers() {
    if (!db) await initDB();
    return await db.select('SELECT * FROM barbers');
}

关键注意事项

  • 绝对不要硬编码路径,必须用Tauri的路径API动态生成,否则打包后路径会失效。
  • 不要尝试从Vue目录直接访问本地SQLite文件,WebView没有直接访问本地文件系统的权限(除非配置权限,但也不推荐)。
  • 开发时如果修改了项目中的数据库文件,要手动删除应用数据目录下的旧文件,或者在Rust代码中添加覆盖逻辑(根据需求)。

内容的提问来源于stack exchange,提问作者Abubakr Shomirsaidov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 22:11:24