Tauri + Turso
Tauri 데스크톱 앱에도 몇 분이면 Turso를 붙일 수 있어요. 이 가이드는 크레이트 의존성 설정부터 임베디드 레플리카 구성, Tauri 커맨드에서 SQL을 실행하는 방법까지 안내해요.
출처: 문서
본문
시작 전 준비물
시작하기 전에 다음을 확인해 주세요.
- Turso CLI 설치
- Turso 가입 또는 로그인
- Tauri 앱 준비 — 자세히 알아보기
단계별 진행
1. Tauri 프로젝트 의존성에 다음 크레이트 추가하기
[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" }
2. src-tauri 디렉터리 안에서 Rust 의존성 가져오기
cargo fetch
3. 데이터베이스 자격 증명 설정
데이터베이스 URL을 확인해요.
turso db show --url <database-name>
데이터베이스 인증 토큰을 만들어요.
turso db tokens create <database-name>
확보한 자격 증명을 src-tauri/.env 안의 환경 변수에 할당해요.
TURSO_SYNC_URL="..."
TURSO_AUTH_TOKEN="..."
DB_PATH=./my-data.db # embedded replica
4. 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)
- Personal Notes App — github.com/tursodatabase/examples에서 전체 소스 코드를 볼 수 있어요.
더 알아보기 (Learn more)
- Rust 퀵스타트 — Rust용 libSQL 클라이언트 기본 사용법
- 임베디드 레플리카 — 로컬 replica 동기화 개념 이해하기
- Axum 연동 가이드 — Axum 프레임워크에서 Turso 쓰기
- 데이터베이스 토큰 — 인증 토큰 관리 방법