この記事は、Prisma使用中に「All data will be lost?」という警告メッセージが表示された際の対処法を解説します。
こんにちは、株式会社KakuKakuのhamanoです。
Prismaを使用していた際、私は大きな失敗をしました。
それは、全データを失うという事態です。
使用中のデータベースが、テーブルの枠組みだけを残して空になってしまいました。
幸い、バックアップがあったので大きな損害は避けられましたが、その時は非常に焦りました。
今回は、そうした経験を生かして、皆様が同じような事態に陥らないように、この記事を作成しました。
すでに「All Data will be lost?」で「Yes」を選んだ方へ
残念ながら、一度失ったデータは元には戻りません。
(データ復旧の方法をご存じの方は、ぜひ教えてください。)
実際に起こったケース
私は、Prismaを初めて使った時、
大量のデータが入っているモデルのカラム名を更新するために、モデルのスキーマを変更し、
以下のコマンドを実行しました。
$ npx prisma db push
この時、以下のメッセージが表示されました。
All data will be lost?
誤って「y」を選択し、すべてのデータを失いました。
「All data will be lost?」と聞かれた理由
新しいモデルを作成する際にはこの問題は発生しませんが、既存のモデルを更新する際には起こりえます。
PrismaやSQLで作成したモデルにデータを既に入れており、その後でフィールドの型定義や名前を変更しようとすると、既存のデータとの矛盾が生じ、データベースの初期化が必要になることがあります。
「All data will be lost?」と聞かれたらどうする?
データベース内のデータを保持したい場合は、「No」を選びましょう。
データを空にしても問題ない場合は、「Yes」を選択しても良いです。
データを保持しつつモデルを更新したい場合
以降は「No」を選んだ人へお伝えします。
カラム名を変更するには
私の場合、Azure Data Studioを介してSQLを使用してデータベースを修正しました。
Prismaを使用しているにも関わらずSQLに手を出すのは矛盾していますが、必要だと判断しました。
例えば、Userモデルのaccountカラムをemailに変更するには、
SQL Serverのコードです。ご注意ください。
EXEC sp_rename 'User.account', 'email', 'COLUMN';
この方法でカラム名を変更できます。
型定義を変更するには
型を変更する場合もSQLで対応します。
ただし、値が新しい型に適合するかを確認する必要があります。
例えば、VARCHARからINTへの変換をする場合、
'123' → 123
'あいう' → 数値への変換不可
SQL Serverのコードです。
ALTER TABLE ModelName
ALTER COLUMN ColumnName INT;
これにより、カラムの型を変更できます。
SQLで直接変更する際の注意点
SQLでモデルを変更する場合は、必ずPrismaのスキーマも更新してください。
異なる場合は、後に大きな問題が生じる可能性があります。
最後に
最後までお読みいただきありがとうございます。
私たち株式会社Kakukakuでは、共に開発を進めるスタッフやパートナーを募集しています。
https://kakukaku.app/