TypeScriptにしか無かった統計をCloudflare D1へ移し切る:「全部入ったのか」と確かめた朝の続き
TypeScriptにしか無かった統計をCloudflare D1へ移し切る
前日分の /make-diary が全ステップを終えた。
前の日に 月次統計の正本を Cloudflare D1 へ移す作業 を始め、取得スクリプト4本を切り替えたばかりだった。
報告を読んで、「データベースへの移行が全て完了して、今回全部入ったってことですかね?」と聞いた。
答えは「いいえ、移行はまだ途中です」だった。 移行済みの4系列(Phase 1)は、この朝はじめて D1 経由で毎朝のチェーンを通り、どれもエラーなく終わった。 ただ、どの系列も新しい月が出ていない日で、D1 に新しく入った行は0件だった。
過去分は D1 に入っているのか
新しい行が0件なのはかまわない。 引っかかったのは過去分のほうだ。 これまで TypeScript のファイルで持っていた統計は、全部 D1 に入っていると理解していた。
その理解で合っているかを Claude Code に確かめさせた。
D1 へ読み取りだけの照会(stats-db.mjs status)をかけた結果は「半分ほど」だった。
過去分まで D1 に入っているのは Phase 1 の4ファイルだけで、残りの統計はまだ TS ファイルにしか無い。
Turso はそのまま、TS にしか無いものは D1 へ
ここで方針を決めた。 Turso に入っているものは、いったん Turso のままでいい。 TypeScript でしか持っていないものは、全部 D1 に入れる。 これから新しく取得する分は D1 に入っていくのだから、過去分も入れておけば整合性が取れる。 入れない理由は、あまり無い気がした。 次の Phase 2 で入れる予定なのかとも思ったが、その場で「じゃあ入れて」と頼んだ。
進め方は、値を入れるだけでなく更新の経路まで切り替える形になった。
データと計算関数が同じファイルにいた
最初に手を付けたのは、TS ファイルに値と一緒に書いてあるコメントの扱いだった。
Claude Code にコメントを拾う関数を書かせ、業界団体の統計ファイルでコメントの位置を正しく拾えることを確かめた。
続けて、TS と D1 の行を相互に変換する部分(ssotCodec)を広げさせた。
既存の80テストは通った。
次に出てきたのが、データと計算関数が同じファイルに同居している5本だった。 これをデータだけのファイルに分けさせた。 PDF から取った単価、品目別の輸出と順に切り出していく途中で、型定義の閉じ括弧が1行抜けたので直させた。 4本の分割は、HEAD と比べて値も関数名も一致した。 残る品目別の旬報スナップショットは、生データからスナップショットを導く形に書き直させ、こちらも値が HEAD と一致した。
そのうえで、D1 に入れる対象の一覧(ssotFiles.mjs)に10ファイルを足した。
変換後の TS を HEAD と比べる
変換を通した TS を、HEAD の TS と突き合わせてもらった。
- コメントは全ファイルで1行も落ちていない
- メモリ価格と PDF 単価は、本文まで1字も変わらない
- ほかのファイルの差は小数の末尾のゼロ(
39.90→39.9)だけで、値は同じ
1つだけ、1〜20日累計の行数が1行減っていた。 何が変わったのかを確かめさせてから、先へ進んだ。
メモリ価格の取得スクリプトと、sync.mjs の ingest の経路も直させた。
手で書いている8ファイルの冒頭には、「値の正本は D1。直したら ingest を流す」という案内を足した。
今回足した変換(コメントの保持、複数の配列、任意フィールド、グループ)もテストに加えた。
stats-db のテストは119件すべて通り、全体でも266ファイルの21,177件が通った。
D1 へ実際に入れる
ここでようやく D1 に値を入れた。 メモリ価格は30系列の4,952行が入り、TS は1字も変わらなかった。 続けて、手書き系列の8ファイルを入れた。
手書き系列には、TS を手で直す場面がある。
そのときの動きも試させた。
手で直した直後は generate が止まり、ingest で取り込むと、コメントは D1 に入って TS にも残った。
試しに足したコメントは消して元に戻した。
テスト前に ingest を流す手順(Step 5)や報告の書き方、メモリ価格の手順書の期待出力、設計メモも、新しい流れに合わせて書き換えさせた。
dev では、触ったデータを使う3ページ(韓国の輸出、業界団体の統計、メモリ価格)の描画とコンソールを確かめ、どれも問題がなかった。
コミットは d1cd8b9c で、2回目の Codex レビューは指摘なしだった。
これで、TS にしか無かった統計はすべて D1 に入った。
毎朝の更新も、これからは D1 経由で TS を作る形になる。
push を頼み、2つのリポジトリとも送った(mdx-playground は 8a63bc78..d1cd8b9c の3コミット)。
台湾企業の月次売上はどこにあるのか
push のあとで、もう1つ気になった。 個別企業、特に台湾企業の月次売上が入っていない気がする。
D1 の一覧には、たしかに出てこない。
ただ、入っていないわけではなかった。
台湾企業の月次売上は、もともと Turso に全部入っている。
stats-db.mjs status が見るのは D1 だけなので、一覧に出なかったのだ。
Claude Code に Turso のローカルレプリカを数えさせて、それを確かめた。
「あ、そっか、Turso に入ってんのか」と納得した。
置き場は2つに分かれている。
- Turso:台湾企業の月次売上(37銘柄)と決算系。最初から DB が正本
- D1:これまで TS ファイルにしか無かった統計。今回すべて移した
学び
- 新しく入った行が0件でも、過去分が D1 にあるかどうかはわからない。照会して初めて、入っているのは半分だと分かった
- 一覧に出ないことは、データが無いことを意味しない。台湾企業の月次売上は D1 の一覧に出ないだけで、Turso に全部入っていた