---
title: Tauri2.0のバックエンドDBにDuckDBを使う
tags: 
author: [Norihiro Narayama](https://www.docswell.com/user/northprint)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/GE5RXW8XJ4.jpg?width=480
description: Tauri2.0のバックエンドDBにDuckDBを使う by Norihiro Narayama
published: April 09, 25
canonical: https://www.docswell.com/s/northprint/ZWWYNY-2025-04-09-172353
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/GE5RXW8XJ4.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/972DXQKQ7R.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/DJY28WNYJM.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/V7N8Q9XRE8.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/YJ9KD28ZJ3.jpg)

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


# Page. 6

![Page Image](https://bcdn.docswell.com/page/GJ8R35ZY7D.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/LJLKVYD97R.jpg)

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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/47M2GNPV7W.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/P7RMZD1WJ9.jpg)

フロントエンドから呼び出す（参考）
import { invoke } from &quot;@tauri-apps/api/tauri&quot;;
async function callGreet() {
try {
const result = await invoke(&quot;greet&quot;, { name: &quot;World&quot; });
console.log(result);
} catch (error) {
console.error(&quot;Greeting failed:&quot;, error);
}
}
invoke()
で Rust 関数を非同期呼び出し
9 / 15


# Page. 10

![Page Image](https://bcdn.docswell.com/page/PJXV91YVEX.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/3JKQP235JD.jpg)

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


# Page. 12

![Page Image](https://bcdn.docswell.com/page/LE3PX4G1J5.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/8EDL2Q1KJG.jpg)

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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/V7P21LQ378.jpg)

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


# Page. 15

![Page Image](https://bcdn.docswell.com/page/2JVDYQ5NJQ.jpg)

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


