[{"data":1,"prerenderedAt":245},["ShallowReactive",2],{"content-/ts-only-stats-into-cloudflare-d1":3,"all-pages-for-dir":224,"related-/ts-only-stats-into-cloudflare-d1":225,"og-image-/ts-only-stats-into-cloudflare-d1":244},{"id":4,"title":5,"body":6,"category":205,"concepts":206,"description":207,"extension":208,"meta":209,"navigation":210,"ogImage":206,"path":211,"project_name":212,"published":213,"publishedAt":214,"seo":215,"source":216,"stem":217,"tags":218,"todo":206,"unpublished":213,"updatedAt":206,"__hash__":223},"pages/2026-10/2026-10-06/ts-only-stats-into-cloudflare-d1.md","TypeScriptにしか無かった統計をCloudflare D1へ移し切る：「全部入ったのか」と確かめた朝の続き",{"type":7,"value":8,"toc":194},"minimark",[9,14,29,32,37,40,47,51,54,57,60,67,70,77,81,84,105,108,119,123,126,136,143,150,153,156,162,165,168,183,186],[10,11,13],"h1",{"id":12},"typescriptにしか無かった統計をcloudflare-d1へ移し切る","TypeScriptにしか無かった統計をCloudflare D1へ移し切る",[15,16,17,18,22,23,28],"p",{},"前日分の ",[19,20,21],"code",{},"/make-diary"," が全ステップを終えた。\n前の日に ",[24,25,27],"a",{"href":26},"/stats-ssot-to-cloudflare-d1","月次統計の正本を Cloudflare D1 へ移す作業"," を始め、取得スクリプト4本を切り替えたばかりだった。\n報告を読んで、「データベースへの移行が全て完了して、今回全部入ったってことですかね？」と聞いた。",[15,30,31],{},"答えは「いいえ、移行はまだ途中です」だった。\n移行済みの4系列（Phase 1）は、この朝はじめて D1 経由で毎朝のチェーンを通り、どれもエラーなく終わった。\nただ、どの系列も新しい月が出ていない日で、D1 に新しく入った行は0件だった。",[33,34,36],"h2",{"id":35},"過去分は-d1-に入っているのか","過去分は D1 に入っているのか",[15,38,39],{},"新しい行が0件なのはかまわない。\n引っかかったのは過去分のほうだ。\nこれまで TypeScript のファイルで持っていた統計は、全部 D1 に入っていると理解していた。",[15,41,42,43,46],{},"その理解で合っているかを Claude Code に確かめさせた。\nD1 へ読み取りだけの照会（",[19,44,45],{},"stats-db.mjs status","）をかけた結果は「半分ほど」だった。\n過去分まで D1 に入っているのは Phase 1 の4ファイルだけで、残りの統計はまだ TS ファイルにしか無い。",[33,48,50],{"id":49},"turso-はそのままts-にしか無いものは-d1-へ","Turso はそのまま、TS にしか無いものは D1 へ",[15,52,53],{},"ここで方針を決めた。\nTurso に入っているものは、いったん Turso のままでいい。\nTypeScript でしか持っていないものは、全部 D1 に入れる。\nこれから新しく取得する分は D1 に入っていくのだから、過去分も入れておけば整合性が取れる。\n入れない理由は、あまり無い気がした。\n次の Phase 2 で入れる予定なのかとも思ったが、その場で「じゃあ入れて」と頼んだ。",[15,55,56],{},"進め方は、値を入れるだけでなく更新の経路まで切り替える形になった。",[33,58,59],{"id":59},"データと計算関数が同じファイルにいた",[15,61,62,63,66],{},"最初に手を付けたのは、TS ファイルに値と一緒に書いてあるコメントの扱いだった。\nClaude Code にコメントを拾う関数を書かせ、業界団体の統計ファイルでコメントの位置を正しく拾えることを確かめた。\n続けて、TS と D1 の行を相互に変換する部分（",[19,64,65],{},"ssotCodec","）を広げさせた。\n既存の80テストは通った。",[15,68,69],{},"次に出てきたのが、データと計算関数が同じファイルに同居している5本だった。\nこれをデータだけのファイルに分けさせた。\nPDF から取った単価、品目別の輸出と順に切り出していく途中で、型定義の閉じ括弧が1行抜けたので直させた。\n4本の分割は、HEAD と比べて値も関数名も一致した。\n残る品目別の旬報スナップショットは、生データからスナップショットを導く形に書き直させ、こちらも値が HEAD と一致した。",[15,71,72,73,76],{},"そのうえで、D1 に入れる対象の一覧（",[19,74,75],{},"ssotFiles.mjs","）に10ファイルを足した。",[33,78,80],{"id":79},"変換後の-ts-を-head-と比べる","変換後の TS を HEAD と比べる",[15,82,83],{},"変換を通した TS を、HEAD の TS と突き合わせてもらった。",[85,86,87,91,94],"ul",{},[88,89,90],"li",{},"コメントは全ファイルで1行も落ちていない",[88,92,93],{},"メモリ価格と PDF 単価は、本文まで1字も変わらない",[88,95,96,97,100,101,104],{},"ほかのファイルの差は小数の末尾のゼロ（",[19,98,99],{},"39.90"," → ",[19,102,103],{},"39.9","）だけで、値は同じ",[15,106,107],{},"1つだけ、1〜20日累計の行数が1行減っていた。\n何が変わったのかを確かめさせてから、先へ進んだ。",[15,109,110,111,114,115,118],{},"メモリ価格の取得スクリプトと、",[19,112,113],{},"sync.mjs"," の ",[19,116,117],{},"ingest"," の経路も直させた。\n手で書いている8ファイルの冒頭には、「値の正本は D1。直したら ingest を流す」という案内を足した。\n今回足した変換（コメントの保持、複数の配列、任意フィールド、グループ）もテストに加えた。\nstats-db のテストは119件すべて通り、全体でも266ファイルの21,177件が通った。",[33,120,122],{"id":121},"d1-へ実際に入れる","D1 へ実際に入れる",[15,124,125],{},"ここでようやく D1 に値を入れた。\nメモリ価格は30系列の4,952行が入り、TS は1字も変わらなかった。\n続けて、手書き系列の8ファイルを入れた。",[15,127,128,129,132,133,135],{},"手書き系列には、TS を手で直す場面がある。\nそのときの動きも試させた。\n手で直した直後は ",[19,130,131],{},"generate"," が止まり、",[19,134,117],{}," で取り込むと、コメントは D1 に入って TS にも残った。\n試しに足したコメントは消して元に戻した。",[15,137,138,139,142],{},"テスト前に ingest を流す手順（Step 5）や報告の書き方、メモリ価格の手順書の期待出力、設計メモも、新しい流れに合わせて書き換えさせた。\ndev では、触ったデータを使う3ページ（韓国の輸出、業界団体の統計、メモリ価格）の描画とコンソールを確かめ、どれも問題がなかった。\nコミットは ",[19,140,141],{},"d1cd8b9c"," で、2回目の Codex レビューは指摘なしだった。",[15,144,145,146,149],{},"これで、TS にしか無かった統計はすべて D1 に入った。\n毎朝の更新も、これからは D1 経由で TS を作る形になる。\npush を頼み、2つのリポジトリとも送った（mdx-playground は ",[19,147,148],{},"8a63bc78..d1cd8b9c"," の3コミット）。",[33,151,152],{"id":152},"台湾企業の月次売上はどこにあるのか",[15,154,155],{},"push のあとで、もう1つ気になった。\n個別企業、特に台湾企業の月次売上が入っていない気がする。",[15,157,158,159,161],{},"D1 の一覧には、たしかに出てこない。\nただ、入っていないわけではなかった。\n台湾企業の月次売上は、もともと Turso に全部入っている。\n",[19,160,45],{}," が見るのは D1 だけなので、一覧に出なかったのだ。\nClaude Code に Turso のローカルレプリカを数えさせて、それを確かめた。",[15,163,164],{},"「あ、そっか、Turso に入ってんのか」と納得した。",[15,166,167],{},"置き場は2つに分かれている。",[85,169,170,177],{},[88,171,172,176],{},[173,174,175],"strong",{},"Turso","：台湾企業の月次売上（37銘柄）と決算系。最初から DB が正本",[88,178,179,182],{},[173,180,181],{},"D1","：これまで TS ファイルにしか無かった統計。今回すべて移した",[33,184,185],{"id":185},"学び",[85,187,188,191],{},[88,189,190],{},"新しく入った行が0件でも、過去分が D1 にあるかどうかはわからない。照会して初めて、入っているのは半分だと分かった",[88,192,193],{},"一覧に出ないことは、データが無いことを意味しない。台湾企業の月次売上は D1 の一覧に出ないだけで、Turso に全部入っていた",{"title":195,"searchDepth":196,"depth":196,"links":197},"",2,[198,199,200,201,202,203,204],{"id":35,"depth":196,"text":36},{"id":49,"depth":196,"text":50},{"id":59,"depth":196,"text":59},{"id":79,"depth":196,"text":80},{"id":121,"depth":196,"text":122},{"id":152,"depth":196,"text":152},{"id":185,"depth":196,"text":185},"dev",null,"D1経由の毎朝チェーンが初めて通った日、過去分も全部D1に入っているのかと確かめたら、答えは半分だった。TSファイルにしか無い統計をD1へ入れて更新の経路も切り替え、台湾企業の月次売上はTursoにあると確かめるまでの記録。","md",{},true,"/ts-only-stats-into-cloudflare-d1","mdx-playground",false,"2026-10-06T00:00:00.000Z",{"title":5,"description":207},"make-diary","2026-10/2026-10-06/ts-only-stats-into-cloudflare-d1",[219,175,220,221,222],"Cloudflare D1","SSOT","統計データ","Claude Code","E7LoryqrgKobEmtaZFs3o-t5f8bKnjYB3v6SahD-Fuk",[],[226,229,233,236,240],{"title":227,"path":26,"publishedAt":228},"月次統計のSSOTをGitのTSファイルからCloudflare D1へ移す：Turso推奨を過去の検討資料で改めた日","2026-10-05T00:00:00.000Z",{"title":230,"path":231,"publishedAt":232},"蔵書DBの書籍取り込み：雑学本をサブエージェント5体で1項目1チャンクに分け直し、Webセキュリティの資料をOCRから仕上げる","/book-db-zatsugaku-subagent-restructure","2026-09-30T00:00:00.000Z",{"title":234,"path":235,"publishedAt":232},"雑学ショート動画を11本まで一気に作った日｜脂肪の出口ネタの記事化から、BGMの途切れ対策と1文ずつ直せるレビュー画面まで","/sns-shorts-trivia-batch-production",{"title":237,"path":238,"publishedAt":239},"RSVP速読リーダーを自作した記録：画像2枚の企画からPhase 5まで、蔵書DBの本を1,500字/分で読めるか試す","/rsvp-reader-kickoff-phase3","2026-09-27T00:00:00.000Z",{"title":241,"path":242,"publishedAt":243},"Excel講座の本人音声を全編再合成した日：読み上げ台本を「耳で分かるか」でレビューし、聞いた感想を区間単位で直す","/excel-course-narration-ear-review-feedback","2026-09-23T00:00:00.000Z","https://log.eurekapu.com/og/blog/ts-only-stats-into-cloudflare-d1.png?v=2026-10-06T00%3A00%3A00.000Z&title=TypeScript%E3%81%AB%E3%81%97%E3%81%8B%E7%84%A1%E3%81%8B%E3%81%A3%E3%81%9F%E7%B5%B1%E8%A8%88%E3%82%92Cloudflare%20D1%E3%81%B8%E7%A7%BB%E3%81%97%E5%88%87%E3%82%8B%EF%BC%9A%E3%80%8C%E5%85%A8%E9%83%A8%E5%85%A5%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B%E3%80%8D%E3%81%A8%E7%A2%BA%E3%81%8B%E3%82%81%E3%81%9F%E6%9C%9D%E3%81%AE%E7%B6%9A%E3%81%8D&author=Kei%20Komatsu&sig=2c909134bb90a4a7",1791766733314]