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

JavaScriptプロジェクトにおけるPlanetScaleのイントロスペクション

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)いいえいいえ✔️
titlevarchar(255)いいえいいえ✔️-
contentvarchar(191)いいえいいえいいえ-
publishedtinyint(1)いいえいいえ✔️false
authorIdintいいえいいえ✔️-

Profile

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

User

カラム名プライマリキー外部キー必須デフォルト
idint✔️いいえ✔️自動インクリメント
namevarchar(191)いいえいいえいいえ-
emailvarchar(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?
}

その後、データベースで再度イントロスペクションを実行します

npx prisma db pull

Prisma Migrateは、手動で追加されたリレーションフィールドを保持するようになります。

リレーションフィールドは仮想的である(つまり、データベースに直接現れない)ため、データベースに手を加えることなくPrismaスキーマで手動で名前を変更できます。

この例では、データベーススキーマはPrisma ORMモデルの命名規則に従っています。これにより、生成されたPrisma Client APIの人間工学が最適化されます。

カスタムモデルとフィールド名の使用

しかし、Prisma Client APIで公開されるカラム名やテーブル名に追加の変更を加えたい場合があります。一般的な例としては、データベーススキーマでよく使用されるsnake_case記法を、JavaScript/TypeScript開発者にとってより自然に感じるPascalCasecamelCase記法に変換することです。

イントロスペクションから、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の設定ページでご確認ください。

© . All rights reserved.