メインコンテンツにスキップ

イントロスペクション

Introspect your database with 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;
テーブルのグラフィカルな概要を展開

投稿

カラム名主キー外部キー必須デフォルト
idint✔️いいえ✔️自動インクリメント
createdAtdatetime(3)いいえいいえ✔️now()
updatedAtdatetime(3)いいえいいえ✔️
タイトルvarchar(255)いいえいいえ✔️-
コンテンツvarchar(191)いいえいいえいいえ-
公開済みtinyint(1)いいえいいえ✔️false
authorIdintいいえいいえ✔️-

プロフィール

カラム名主キー外部キー必須デフォルト
idint✔️いいえ✔️自動インクリメント
自己紹介varchar(191)いいえいいえいいえ-
userIdintいいえいいえ✔️-

ユーザー

カラム名主キー外部キー必須デフォルト
idint✔️いいえ✔️自動インクリメント
名前varchar(191)いいえいいえいいえ-
メールアドレスvarchar(191)いいえいいえ✔️-

次のステップとして、データベースをイントロスペクトします。イントロスペクションの結果は、Prismaスキーマ内のデータモデルになります。

データベースをイントロスペクトするには、次のコマンドを実行します

npx prisma db pull

このコマンドは、.envで定義されているDATABASE_URL環境変数を読み取り、データベースに接続します。接続が確立されると、データベースをイントロスペクトします(つまり、データベーススキーマを読み取ります)。次に、データベーススキーマをSQLからPrismaデータモデルに変換します。

イントロスペクションが完了すると、Prismaスキーマが更新されます

Introspect your database

データモデルは次のようになります

prisma/schema.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インスタンスは、これらのモデルに合わせて調整されたクエリを公開します。

次に、リレーションフィールドを使用して、データ間の不足しているリレーションを追加する必要があります

prisma/schema.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)
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の構成」ページをご覧ください。