• #EDINET API
  • #Turso
  • #libsql
  • #Python
  • #財務データ
  • #Embedded Replica
  • #Chart.js
開発misc-devメモ

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 createturso 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-dotenvload_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)は、分析ワークロードで繰り返しクエリを投げる用途に向いている。