Prerequisites
Before you start, make sure you:
Add the following crates to the Tauri project's dependencies
[dependencies]
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
reqwest = { version = "0.11.22", features = ["json", "blocking"] }
dotenvy = "0.15.7"
tokio = { version = "1", features = ["full"] }
libsql = { git = "https://github.com/tursodatabase/libsql" }
tracing-subscriber = "0.3"
tracing = "0.1.40"
[patch.crates-io]
sqlite3-parser = { git = "https://github.com/LucioFranco/lemon-rs" }
Fetch Rust dependencies inside the `src-tauri` directory.
Configure database credentials
Get the database URL.
turso db show --url <database-name>
Get the database authentication token.
turso db tokens create <database-name>
Assign acquired credentials to the environment variables inside src-tauri/.env
.
TURSO_SYNC_URL="..."
TURSO_AUTH_TOKEN="..."
DB_PATH=./my-data.db
Execute SQL
use dotenvy::dotenv;
use libsql::{params, Database};
use serde::{Deserialize, Serialize};
use std::env;
use tracing::info;
#[derive(Serialize, Debug)]
struct Error {
msg: String,
}
type Result<T> = std::result::Result<T, Error>;
impl<T> From<T> for Error
where
T: std::error::Error,
{
fn from(value: T) -> Self {
Self {
msg: value.to_string(),
}
}
}
#[derive(Deserialize, Serialize, Debug)]
pub struct Item {
id: String,
foo: String,
bar: String,
}
#[tauri::command]
async fn get_all_items() -> Result<Vec<Item>> {
dotenv().expect(".env file not found");
let db_path = env::var("DB_PATH").unwrap();
let sync_url = env::var("TURSO_SYNC_URL").unwrap();
let auth_token = env::var("TURSO_AUTH_TOKEN").unwrap();
let db = Database::open_with_remote_sync(db_path, sync_url, auth_token).await?;
let conn = db.connect()?;
let mut results = conn
.query("SELECT * FROM table_name", ())
.await?;
let mut items: Vec<Item> = Vec::new();
while let Some(row) = results.next()? {
let note: Item = Item {
id: row.get(0)?,
foo: row.get(1)?,
bar: row.get(2)?,
};
items.push(item);
}
Ok(items)
}
fn main() {
tracing_subscriber::fmt::init();
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![
get_all_items,
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
Examples