Tauri2.0のバックエンドDBにDuckDBを使う

766 Views

April 09, 25

スライド概要

profile-image

株式会社MIERUNE所属 主にアプリケーションのフロントエンド開発をしています

Docswellを使いましょう

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

Tauri2.0 のバックエンド DB に DuckDB を使う @northprint / MIERUNE 1 / 15

2.

はじめに アドベントカレンダーの延長 Qiita 記事 Web だけでは手元の GeoJSON を扱うのが難しかった ローカルの GeoJSON を雑に調べられるツールを作ってみた 2 / 15

3.

なぜ Tauri? Web アプリの制約 ローカルファイルの扱いがうまくいかなかった 雑に使えるツールが欲しかった Tauri ならできるかも? Rust + WebView 構成 軽量・高速なネイティブアプリが作れる 3 / 15

4.

とりあえず作ってみた GeoJSON を開くものを作るところからスタート どうせなら DuckDB を使っての永続保存もやってみよう 4 / 15

5.

しかし挫折 DuckDB を使って保存しようとしたらクラッシュ (おそらく Rust の DuckDB ラッパー周りの問題) 原因は深追いせず、AI に回避策を尋ねた 5 / 15

6.

回避策(AI の提案) 1. GeoJSON データを受け取る 2. SQLite に一時保存 3. SQLite → DuckDB へ読み込み 4. DuckDB で空間処理(重心計算) 5. SQLite 一時ファイルを削除(本来ここはいらない) 6 / 15

7.

得られた知見 現段階で Tauri 2.0 で DB 永続化をするなら SQLite が無難 DuckDB はインメモリで使うのが安全かも 高速で軽く、空間処理もできる 7 / 15

8.
[beta]
Rust のコマンド定義(参考)
#[tauri::command]
fn greet(name: String) -> String {
format!("Hello, {}! You've been greeted from Rust!", name)
}
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![
greet
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

8 / 15

9.
[beta]
フロントエンドから呼び出す(参考)
import { invoke } from "@tauri-apps/api/tauri";
async function callGreet() {
try {
const result = await invoke("greet", { name: "World" });
console.log(result);
} catch (error) {
console.error("Greeting failed:", error);
}
}
invoke()

で Rust 関数を非同期呼び出し
9 / 15

10.

DuckDB で重心計算(参考) WITH geoms AS (SELECT ST_GeomFromGeoJSON(geom) AS geom FROM temp_geom), collected AS (SELECT ST_Collect(ARRAY_AGG(geom)) AS collected_geom FROM geoms), centroid AS (SELECT ST_Centroid(collected_geom) AS point FROM collected) SELECT ST_X(point) as lon, ST_Y(point) as lat FROM centroid GeoJSON → geometry → 重心までを SQL で 10 / 15

11.

SQL の処理詳細(参考) 1. GeoJSON 文字列を geometry に変換 ST_GeomFromGeoJSON(geom) 2. geometry をまとめる ARRAY_AGG() → ST_Collect() 3. 重心を求める ST_Centroid() 4. 緯度経度に展開 ST_X(), ST_Y() 11 / 15

12.

AI の働きが面白かった話 上記 SQL がエラーになったとき AI が平均を取る重心ロジックをフォールバック 関数として勝手に書いた たまに意外なアルゴリズムが返ってくるのが面白い 12 / 15

13.

実演デモ 実際に動作している様子を紹介します ソースコード公開しました! 13 / 15

14.

感想・まとめ DuckDB は手軽で便利 バックエンドで起きたエラーは画面に出すなど工夫が必要 Rust は AI 任せでもある程度までは OK 14 / 15

15.

今後やってみたいこと DuckDB インメモリ専用運用への移行 Shapefile など対応 GeoJSON 編集・出力の実装(実はあったのだけど、コードが酷くて一回全部消 した) 自動アップデートやビルド改善 15 / 15