経路を1本に減らしたら、消えていた索引が出てきた — Tursoを外すまでの4本のPR

公開: 2026-09-09
開発日記SQLiteTursoデータ基盤Valscope

Valscope(val.codese.net)が読んでいる dev.db の作り方を変えました。 これまでは Iceberg のデータをいったん Turso(クラウド上のSQLite)へ送り、 それを手元へ読み戻して dev.db を組み立てていました。 今回、Turso を経路から完全に外し、Iceberg から dev.db を直接作る形にしています。

やったこと自体は「経路を1本減らした」だけです。 ただ、減らす過程で前から壊れていたものが1つ表に出てきました。その順で書きます。

変えた形

BEFOREIcebergTursodev.dbBlobHTTPで往復。スキーマは手書きの配列で追従AFTERIcebergdev.dbBlob直接生成。スキーマはマイグレーションが当たる
Turso を挟んでいた往復を外し、Iceberg から dev.db を直接作る1本の経路にした。

1本目 — 切り替えた(#1418)

Iceberg から dev.db を直接作るようにしました。ここまでは順調です。

2本目 — 索引が1つ消えていた(#1420)

切り替えた結果、db/migrations/dev.db に当たらなくなっていました。 経路を変えたときに、マイグレーションを適用する段が経路から落ちていたのです。

表に出たのは、地図ページ(/map)のクエリでした。 索引 027 が無い状態になっており、インデックスを使うはずのクエリが テーブル全走査(SCAN)へ退行していました。

**画面はちゃんと出ます。**ただ遅い。エラーも出ない。 「動いているが、設計した速さでは動いていない」という壊れ方で、 これは切り替えのPRを見ているだけでは気づけませんでした。

適用経路を戻して直しています。

3本目 — Turso を外し切った(#1431)

ここで「もう Turso は要らない」と判断し、残っていたものを全部落としました。

2本目で踏んだ問題は、手で書いた MIGRATIONS 配列が原因でした。 新しいマイグレーションを足しても、配列に書き足さなければ当たらない。 歯抜けが黙って発生します。移設によってこの配列自体が消えたので、 同じ穴はもう掘れません。

もう1つ、dev.db に対象テーブルが無い状態でエクスポートが走り、 0件のまま静かに完了する破損(Issue #1412)を防ぐため、 開始時にテーブルの存在を検査して、無ければ異常終了するようにしました。

4本目 — 書いた説明のほうが間違っていた(#1432)

設計ドキュメントに「まっさらな dev.db からは中身を再構成できない」と書いていました。 これが言い過ぎでした。数え直すと、

つまり全部戻せます。 ただし実運用で壊れたときの最短復旧は、Blob に置いてあるスナップショットを戻すことです。 「戻せる」と「戻すのが速い」は別なので、両方書き直しました。

残ったもの

今回いちばん効いたのは、経路を減らしたこと自体ではなく、 減らす過程で経路の途中の段を1つずつ数え直したことでした。 2本目の索引欠落は、経路を触らなければあと何ヶ月も気づかないままだったはずです。

同じことをやる人向けに、手順と踏んだ挙動を dev.dbを1本の経路で作るへまとめました。