0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

prisma db pushした時の「All data will be lost?」の対処法

Posted at

この記事は、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/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?