Cloudflare D1のテスト環境はCREATE TEMP TABLEを拒否する
D1のテスト環境(miniflare)でマイグレーションSQLを実行したら SQLITE_AUTH エラーになった。原因は CREATE TEMP TABLE 文。
D1はSQLiteベースだが、セキュリティポリシーで一部のSQLite機能を制限している。CREATE TEMP TABLE はその一つで、テスト環境でもプロダクション環境でも使えない。
マイグレーションで一時テーブルが必要な場合の代替手段:
- 通常テーブルを使って最後にDROPする —
CREATE TABLE tmp_xxx→ 処理 →DROP TABLE tmp_xxxで同じことができる - CTEやサブクエリで完結させる — 一時テーブルなしで書き換え可能なケースも多い
-- NG: D1では SQLITE_AUTH エラー
CREATE TEMP TABLE migration_data AS SELECT ...;
-- OK: 通常テーブルを使って最後にDROP
CREATE TABLE migration_data AS SELECT ...;
-- ... 処理 ...
DROP TABLE migration_data;