概要
Next.jsのチュートリアルの第6章を実施中にDBへのシーディングを実行したらエラーになったので自身の場合のケースと解決方法を簡単にまとめる
状況
- NeonにてPostgreSQLのDBを作成
- Neon上でローカル開発環境用の.envに記述する内容をコピーしてローカル開発環境の.env.exampleをコピーして.envを作成し、DBの記述を上書き
- 起動しているローカル開発環境をcmd + cで落とし、
npm run dev
を再度実行 - http://localhost:3000/seed にブラウザでアクセスしてシーディングを試みるもエラーで失敗
エラー内容
http://localhost:3000/seed にアクセスしたところ下記のような内容が表示された。
{
"error": {
"name": "PostgresError",
"severity_local": "ERROR",
"severity": "ERROR",
"code": "23505",
"detail": "Key (extname)=(uuid-ossp) already exists.",
"schema_name": "pg_catalog",
"table_name": "pg_extension",
"constraint_name": "pg_extension_name_index",
"file": "nbtinsert.c",
"line": "666",
"routine": "_bt_check_unique"
}
}
already exists.
と言われているのでシーディングする際に新規設置される何かがすでに存在しており、エラーがでているっぽい。
解消方法
Neon内部で先に作成したDBを指定してテーブルを確認したところ、customersテーブルとrevenueテーブルがすでに作られ、データも入っていた。※このテーブルの作成タイミングはわからなかった。テーブル作成時なのか、http://localhost:3000/seed へのアクセス時に途中で処理が止まったのかは不明。調査する前に先に進んでしまった。
なので下記の手順で先に作成したDBの中のテーブルを全て空にした。
-
Neonにて先に作成したDBの詳細ページにアクセス
-
サイドバーの「SQL Editer」をクリック
-
下記のSQLを実行(テーブル削除なので本当はトランザクションを使ったほうがいい。)
DROP TABLE customers; DROP TABLE revenue;
-
上記を実行後、DBを確認すると謎のテーブル(名前忘れた、、、。)ができていたのでサイドバーからUIのゴミ箱ボタンを押下して謎のテーブルも削除し、DBの内部にテーブルがない状態にクリーンアップ
-
http://localhost:3000/seed にアクセスしたら下記が出たので無事にシーディングは完了
{ "message": "Database seeded successfully" }
-
その後の手順のhttp://localhost:3000/query へのアクセスも実施し、下記のように返ったので6章は終わり
{ "amount": 666, "name": "Evil Rabbit" }
あとがき
6章のやることのページに「DBやレコードがすでに存在していてうまくいかない場合はDROP TABLEを使ってリセットしましょう」って書いてあったの見つけて良かった。割とすぐ解決できた。
ちなみに、後からシーディング系の処理を見てわかったのだが、今回のエラーのKey (extname)=(uuid-ossp) already exists.
はおそらく
await sql`CREATE EXTENSION IF NOT EXISTS "uuid-ossp"`;
の箇所で出たっぽい。
多分主キーのidをuuidにして、そのuuidを自動生成する設定をSQL句を用いて施しているところ。
どのタイミングか不明だが、uuidの自動生成設定がシーディング前に施されており、重ねてシーディング時に施そうとしたためにエラーになったものと思われる。