イントロスペクション
Prisma ORMでデータベースをイントロスペクトする
このガイドの目的のために、3つのテーブルを持つデモSQLスキーマを使用します。
CREATE TABLE `Post` (
`id` int NOT NULL AUTO_INCREMENT,
`createdAt` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` datetime(3) NOT NULL,
`title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`content` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`published` tinyint(1) NOT NULL DEFAULT '0',
`authorId` int NOT NULL,
PRIMARY KEY (`id`),
KEY `Post_authorId_idx` (`authorId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `Profile` (
`id` int NOT NULL AUTO_INCREMENT,
`bio` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`userId` int NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `Profile_userId_key` (`userId`),
KEY `Profile_userId_idx` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `User` (
`id` int NOT NULL AUTO_INCREMENT,
`email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `User_email_key` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
テーブルのグラフィカルな概要を展開
Post
カラム名 | 型 | 主キー | 外部キー | 必須 | デフォルト |
---|---|---|---|---|---|
id | int | ✔️ | いいえ | ✔️ | 自動インクリメント |
createdAt | datetime(3) | いいえ | いいえ | ✔️ | now() |
updatedAt | datetime(3) | いいえ | いいえ | ✔️ | |
title | varchar(255) | いいえ | いいえ | ✔️ | - |
content | varchar(191) | いいえ | いいえ | いいえ | - |
published | tinyint(1) | いいえ | いいえ | ✔️ | false |
authorId | int | いいえ | いいえ | ✔️ | - |
Profile
カラム名 | 型 | 主キー | 外部キー | 必須 | デフォルト |
---|---|---|---|---|---|
id | int | ✔️ | いいえ | ✔️ | 自動インクリメント |
bio | varchar(191) | いいえ | いいえ | いいえ | - |
userId | int | いいえ | いいえ | ✔️ | - |
User
カラム名 | 型 | 主キー | 外部キー | 必須 | デフォルト |
---|---|---|---|---|---|
id | int | ✔️ | いいえ | ✔️ | 自動インクリメント |
name | varchar(191) | いいえ | いいえ | いいえ | - |
email | varchar(191) | いいえ | いいえ | ✔️ | - |
次のステップとして、データベースをイントロスペクトします。イントロスペクションの結果は、Prismaスキーマ内のデータモデルになります。
データベースをイントロスペクトするには、次のコマンドを実行します
npx prisma db pull
このコマンドは、.env
で定義されているDATABASE_URL
環境変数を読み取り、データベースに接続します。接続が確立されると、データベースをイントロスペクトします(つまり、データベーススキーマを読み取ります)。次に、データベーススキーマをSQLからPrismaデータモデルに変換します。
イントロスペクションが完了すると、Prismaスキーマが更新されます
データモデルは次のようになります
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime
title String @db.VarChar(255)
content String?
published Boolean @default(false)
authorId Int
@@index([authorId])
}
model Profile {
id Int @id @default(autoincrement())
bio String?
userId Int @unique
@@index([userId])
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
スキーマ定義の詳細については、Prismaスキーマ参照を参照してください。
Prismaのデータモデルは、データベーススキーマの宣言型表現であり、生成されたPrisma Clientライブラリの基盤として機能します。Prisma Clientインスタンスは、これらのモデルに合わせて調整されたクエリを公開します。
次に、リレーションフィールドを使用して、データ間の不足しているリレーションを追加する必要があります。
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime
title String @db.VarChar(255)
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
@@index([authorId])
}
model Profile {
id Int @id @default(autoincrement())
bio String?
user User @relation(fields: [userId], references: [id])
userId Int @unique
@@index([userId])
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
profile Profile?
}
その後、データベースで2回目のイントロスペクションを実行します
npx prisma db pull
Prisma Migrateは、手動で追加されたリレーションフィールドを保持するようになります。
リレーションフィールドは仮想であるため(つまり、データベースに直接現れるわけではありません)、データベースに触れることなく、Prismaスキーマで手動で名前を変更できます。
この例では、データベーススキーマはPrisma ORMモデルの命名規則に従っています。これにより、生成されたPrisma Client APIの人間工学が最適化されます。
カスタムモデルとフィールド名の使用
ただし、Prisma Client APIで公開されるカラムとテーブルの名前に追加の変更を加えたい場合があります。一般的な例は、データベーススキーマでよく使用されるsnake_case表記を、JavaScript/TypeScript開発者にとってより自然に感じられるPascalCaseおよびcamelCase表記に変換することです。
snake_case表記に基づいてイントロスペクションから次のモデルを取得したと仮定します
model my_user {
user_id Int @id @default(autoincrement())
first_name String?
last_name String @unique
}
このモデルのPrisma Client APIを生成した場合、APIでsnake_case表記が採用されます
const user = await prisma.my_user.create({
data: {
first_name: 'Alice',
last_name: 'Smith',
},
})
Prisma Client APIでデータベースのテーブル名とカラム名を使用したくない場合は、@map
および@@map
で構成できます
model MyUser {
userId Int @id @default(autoincrement()) @map("user_id")
firstName String? @map("first_name")
lastName String @unique @map("last_name")
@@map("my_user")
}
このアプローチを使用すると、モデルとそのフィールドに好きな名前を付け、@map
(フィールド名の場合)および@@map
(モデル名の場合)を使用して、基になるテーブルとカラムを指すことができます。Prisma Client APIは次のようになります
const user = await prisma.myUser.create({
data: {
firstName: 'Alice',
lastName: 'Smith',
},
})
詳細については、Prisma Client APIの構成ページをご覧ください。