Closed30
PrismaのMigrationについてひととおり知りたい

都合よくガイドがあるので一個ずつやってくか


When adding a new field to a model with existing data, you can either:
- Use the ? operator to mark the field as nullable
- Provide a default value using the @default() attribute function
既存modelに絡む追加するときは、nullableとするか何らかデータ入れるかしないとまずいってことね

いろいろなデフォルト値
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String @db.VarChar(255)
content String?
published Boolean @default(false)
likes Int @default(0)
authorId Int?
author User? @relation(fields: [authorId], references: [id])
}

あ、prismaのSyntax Highlight効かない

prisma migrate dev
でスキーマ更新をDBにマッピング
migrationファイルの作成と実行


prisma migrate dev
に--create-only
をつける
migrationファイルを作成するだけで、DBには適用しない

-- AlterTable
ALTER TABLE "Post" DROP COLUMN "published",
ADD COLUMN "isPublished" BOOLEAN NOT NULL DEFAULT false;
を
--- Rename table
ALTER TABLE "Post"
RENAME COLUMN "published" TO "isPublished";
に書き換える。そんでprisma migrate dev
。


カラム追加と基本は一緒やけどデフォルト値の書き方だけ確認
...
role Role @default(USER)
}
enum Role {
USER
ADMIN
}


-- CreateEnum
CREATE TYPE "AccessLevel" AS ENUM ('USER', 'ADMIN');
-- AlterTable
ALTER TABLE "User" DROP COLUMN "role",
ADD COLUMN "role" "AccessLevel" NOT NULL DEFAULT 'USER';
-- DropEnum
DROP TYPE "Role";
を
-- RenameEnum
ALTER TYPE "Role" RENAME TO "AccessLevel";
-- AlterTable
ALTER TABLE "User"
ALTER COLUMN role TYPE "AccessLevel";
に書き換えてからmigrate実行

delete enumはcolumnと同じだったからとばした


/*
Warnings:
- You are about to drop the `Post` table. If the table is not empty, all the data it contains will be lost.
*/
-- DropForeignKey
ALTER TABLE "Post" DROP CONSTRAINT "Post_authorId_fkey";
-- DropTable
DROP TABLE "Post";
-- CreateTable
CREATE TABLE "Article" (
"id" SERIAL NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
"title" VARCHAR(255) NOT NULL,
"content" TEXT,
"published" BOOLEAN NOT NULL DEFAULT false,
"authorId" INTEGER,
CONSTRAINT "Article_pkey" PRIMARY KEY ("id")
);
-- AddForeignKey
ALTER TABLE "Article" ADD CONSTRAINT "Article_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
を
--- Rename "Post" table
ALTER TABLE "Post" RENAME TO "Article";
-- AlterTable
ALTER TABLE "Article" RENAME CONSTRAINT "Post_pkey" TO "Article_pkey";
-- RenameForeignKey
ALTER TABLE "Article" RENAME CONSTRAINT "Post_authorId_fkey" TO "Article_authorId_fkey";
に書き換えてから実行する。
primary keyとforeign keyのrenameを忘れずに


記事とタグの中間テーブルでrelation

model TagOnPosts {
// relation scalar field (used in the `@relation` attribute below)
post Post @relation(fields: [postId], references: [id])
postId Int
// relation scalar field (used in the `@relation` attribute above)
tag Tag @relation(fields: [tagId], references: [id])
tagId Int
@@id([postId, tagId])
}

schemaが書ければmigrationに難しいことはない
詳しいことはこちらに書いてある

relation周りはschema書けるかどうかが難しいのでこっちではなくドキュメントを呼んだほうが良さそう
このスクラップは2024/01/04にクローズされました