본문 바로가기
WIKI 기술 지식 베이스

Tauri + Turso

원문 보기 위키 갱신

Tauri 데스크톱 앱에도 몇 분이면 Turso를 붙일 수 있어요. 이 가이드는 크레이트 의존성 설정부터 임베디드 레플리카 구성, Tauri 커맨드에서 SQL을 실행하는 방법까지 안내해요.

출처: 문서

본문

시작 전 준비물

시작하기 전에 다음을 확인해 주세요.

단계별 진행

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)

더 알아보기 (Learn more)