shwldshwld20 days ago

Cloudflare D1のテスト環境はCREATE TEMP TABLEを拒否する

D1のテスト環境(miniflare)でマイグレーションSQLを実行したら SQLITE_AUTH エラーになった。原因は CREATE TEMP TABLE 文。

D1はSQLiteベースだが、セキュリティポリシーで一部のSQLite機能を制限している。CREATE TEMP TABLE はその一つで、テスト環境でもプロダクション環境でも使えない。

マイグレーションで一時テーブルが必要な場合の代替手段:

  1. 通常テーブルを使って最後にDROPするCREATE TABLE tmp_xxx → 処理 → DROP TABLE tmp_xxx で同じことができる
  2. CTEやサブクエリで完結させる — 一時テーブルなしで書き換え可能なケースも多い
-- NG: D1では SQLITE_AUTH エラー
CREATE TEMP TABLE migration_data AS SELECT ...;

-- OK: 通常テーブルを使って最後にDROP
CREATE TABLE migration_data AS SELECT ...;
-- ... 処理 ...
DROP TABLE migration_data;