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
相关产品推荐
相关产品推荐

