EDINET APIで取得した財務データをTurso DBに格納する
EDINET APIで会計ソフトA(E33390)の財務データを引っ張ってきて、Turso DB(東京リージョン)に流し込むPythonスクリプト store_to_turso.py を一から書いた。最終的にChart.jsで36チャートのダッシュボードHTMLを吐き出すところまで到達したが、道中の環境構築で何度もつまずいた。
libsqlパッケージ選定の三転四転
Turso DBにPythonから接続するパッケージ選びで3回転んだ。
1回目: libsql-experimental -- pip installが通らない。調べるとWindows向けのビルド済みwheelが存在しなかった。Rustのビルドツールチェーンが要求されるが、それを入れてまで使うパッケージではない。
2回目: libsql-client -- インストールは通る。しかしHTTP経由の接続しかサポートしておらず、Embedded Replica(ローカルDBファイル + クラウド同期)が使えない。読み取りのたびにHTTPラウンドトリップが走るので、レスポンスがmsオーダーになる。
3回目: libsql -- prebuilt wheelがWindows向けにも提供されていて、pip一発で入った。Embedded Replicaにも対応している。これで決着。
pip install libsql
接続コードは数行で済む:
import libsql_experimental as libsql
conn = libsql.connect("local.db", sync_url=TURSO_URL, auth_token=TOKEN)
conn.sync()
Turso CLIインストールの迷走
CLIの導入でもWindowsの壁にぶつかった。
PowerShellインストールスクリプト -- 公式ドキュメント通りに実行したが、スクリプトが途中でエラーを吐いて止まった。
ZIPダウンロード -- GitHubリリースからWindows用バイナリを直接落とした。展開して実行したら tursodb.exe という名前で、これはDB本体(libSQL)であってCLI管理ツールではなかった。DB作成やトークン管理のコマンドが一切ない。
WSLで導入 -- WSL上のLinuxでCLIをインストールしたら、すんなり動いた。turso db create、turso db tokens create が通る。
最終的な気づき -- Turso Webダッシュボード(app.turso.tech)でDB作成、トークン発行、テーブル確認、SQLクエリ実行まで全部できる。CLIを入れる必要がそもそもなかった。ダッシュボードのUIで東京リージョン(nrt)を選んでDBを作成し、認証トークンを発行した。
Embedded Replicaの動作検証
Embedded Replicaの挙動を手元で確認した。ローカルに local.db ファイルが生成され、書き込みはまずローカルDBに入り、conn.sync() でクラウドのTurso DBと同期される。
読み取り速度の差が歴然としていた:
- ローカル読み取り: μsオーダー(マイクロ秒)
- HTTP経由読み取り: msオーダー(ミリ秒)
ローカルにデータがキャッシュされるので、分析用途で同じデータを繰り返し読む場面ではHTTP経由と比べて桁違いに速い。
データ取得と格納
companiesテーブルの追加
企業コード(E33390)から企業名を自動取得する仕組みを入れた。EDINETの検索API(認証不要・レート制限外)を叩くと、企業名が返ってくる。これを companies テーブルに格納して、以降のクエリで企業名をJOINできるようにした。
全6エンドポイントのデータ取得
EDINET APIの以下6エンドポイントからデータを引いて、それぞれ対応するテーブルに格納した:
| エンドポイント | 内容 |
|---|---|
financials | 年次財務データ |
financials_quarterly | 四半期財務データ |
segments | セグメント情報 |
employees | 従業員データ |
management | 経営指標 |
credit_score | 信用スコア |
スクリプトは各エンドポイントを順に叩き、レスポンスJSONをパースしてINSERT OR REPLACEでTursoDB上のテーブルに流し込む構成にした。
Chart.jsダッシュボード生成
取得した全データをChart.jsで可視化するHTMLを生成した。6エンドポイント x 複数指標で合計36チャート。売上推移、利益率、セグメント別売上構成、従業員数推移、信用スコア変動などを一画面で俯瞰できる。
HTMLファイル1枚に全チャートを埋め込み、ブラウザで開くだけで閲覧できる構成にした。外部依存はChart.jsのCDNのみ。
FY2022の販管費急増を読み解く
ダッシュボードを眺めていて、FY2022で販管費が跳ね上がっているのが目に飛び込んできた。中身を掘ると:
- CM・広告費が約40億円: テレビCMやWeb広告への大規模投下
- M&A関連: 証券会社の買収に伴う費用
- 採用競争の激化: SaaS各社との人材獲得合戦で採用コストが膨張
無形資産(のれん + ソフトウェア)の積み上がり
BSを見ると無形資産が年々積み上がっている。これはM&Aで発生した「のれん」と、自社開発のソフトウェア(人件費の資産計上分)が二重に乗っている。SaaS企業特有のBS構造で、開発者の人件費がPLの費用ではなくBSの資産として計上されるため、見かけ上の利益が膨らむ点に注意が要る。
Tursoの無料枠とセキュリティ
Tursoの無料プランの枠を確認した:
- 500データベースまで作成可能
- 9GBストレージ
- 月間10億行の読み取り
個人の分析用途なら余裕がある。セキュリティモデルはトークンベース認証で、DB単位でトークンを発行・失効できる。ダッシュボードからワンクリックでトークンをローテーションできるのも確認した。
APIキー更新のハマりどころ
最後にAPIキーの更新で30分ほど溶かした。
.env 内のEDINET APIキーが期限切れになっていたので新しいキーに書き換えた。ところがスクリプトを実行しても古いキーで認証エラーが出続ける。
原因は python-dotenv の load_dotenv() だった。load_dotenv() はデフォルトで override=False になっており、すでに環境変数に読み込まれている値を上書きしない。同一プロセス内で一度読み込まれた値がキャッシュされていた。
# NG: 既存の環境変数を上書きしない
load_dotenv()
# OK: 明示的にoverrideする
load_dotenv(override=True)
スクリプトの先頭で override=True を付けて解決した。load_dotenv() のデフォルト挙動を知らなかったのは盲点だった。
まとめ
EDINET API → Turso DB → Chart.jsダッシュボードのパイプラインが一本通った。Windowsでのlibsqlパッケージ選定とTurso CLI導入で遠回りしたが、最終的にはpip一発 + Webダッシュボードというシンプルな構成に落ち着いた。Embedded Replicaのローカル読み取り速度(μs)は、分析ワークロードで繰り返しクエリを投げる用途に向いている。