イントロスペクション
Prisma ORM でデータベースをイントロスペクトする
このガイドの目的のために、3 つのテーブルを持つデモ SQL スキーマを使用します。
CREATE TABLE [dbo].[Post] (
[id] INT NOT NULL IDENTITY(1,1),
[createdAt] DATETIME2 NOT NULL CONSTRAINT [Post_createdAt_df] DEFAULT CURRENT_TIMESTAMP,
[updatedAt] DATETIME2 NOT NULL,
[title] VARCHAR(255) NOT NULL,
[content] NVARCHAR(1000),
[published] BIT NOT NULL CONSTRAINT [Post_published_df] DEFAULT 0,
[authorId] INT NOT NULL,
CONSTRAINT [Post_pkey] PRIMARY KEY ([id])
);
CREATE TABLE [dbo].[Profile] (
[id] INT NOT NULL IDENTITY(1,1),
[bio] NVARCHAR(1000),
[userId] INT NOT NULL,
CONSTRAINT [Profile_pkey] PRIMARY KEY ([id]),
CONSTRAINT [Profile_userId_key] UNIQUE ([userId])
);
CREATE TABLE [dbo].[User] (
[id] INT NOT NULL IDENTITY(1,1),
[email] NVARCHAR(1000) NOT NULL,
[name] NVARCHAR(1000),
CONSTRAINT [User_pkey] PRIMARY KEY ([id]),
CONSTRAINT [User_email_key] UNIQUE ([email])
);
ALTER TABLE [dbo].[Post] ADD CONSTRAINT [Post_authorId_fkey] FOREIGN KEY ([authorId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE;
ALTER TABLE [dbo].[Profile] ADD CONSTRAINT [Profile_userId_fkey] FOREIGN KEY ([userId]) REFERENCES [dbo].[User]([id]) ON DELETE NO ACTION ON UPDATE CASCADE;
テーブルのグラフィカルな概要を展開
ユーザー
カラム名 | 型 | 主キー | 外部キー | 必須 | デフォルト |
---|---|---|---|---|---|
id | INT | ✔️ | いいえ | ✔️ | 自動インクリメント |
name | NVARCHAR(1000) | いいえ | いいえ | いいえ | - |
email | NVARCHAR(1000) | いいえ | いいえ | ✔️ | - |
投稿
カラム名 | 型 | 主キー | 外部キー | 必須 | デフォルト |
---|---|---|---|---|---|
id | INT | ✔️ | いいえ | ✔️ | 自動インクリメント |
createdAt | DATETIME2 | いいえ | いいえ | ✔️ | now() |
updatedAt | DATETIME2 | いいえ | いいえ | ✔️ | |
title | VARCHAR(255) | いいえ | いいえ | ✔️ | - |
content | NVARCHAR(1000) | いいえ | いいえ | いいえ | - |
published | BIT | いいえ | いいえ | ✔️ | false |
authorId | INT | いいえ | ✔️ | ✔️ | - |
プロフィール
カラム名 | 型 | 主キー | 外部キー | 必須 | デフォルト |
---|---|---|---|---|---|
id | INT | ✔️ | いいえ | ✔️ | 自動インクリメント |
bio | NVARCHAR(1000) | いいえ | いいえ | いいえ | - |
userId | INT | いいえ | ✔️ | ✔️ | - |
次のステップとして、データベースをイントロスペクトします。イントロスペクションの結果は、Prisma スキーマ内のデータモデルになります。
データベースをイントロスペクトするには、次のコマンドを実行します
npx prisma db pull
このコマンドは、.env
で定義されている DATABASE_URL
環境変数を読み取り、データベースに接続します。接続が確立されると、データベースをイントロスペクトします (つまり、データベーススキーマを読み取ります)。次に、データベーススキーマを SQL から Prisma データモデルに変換します。
イントロスペクションが完了すると、Prisma スキーマが更新されます
データモデルは、現在、次のようになります(モデルのフィールドは、読みやすさのために並べ替えられていることに注意してください)
model Post {
id Int @id @default(autoincrement())
title String @db.VarChar(255)
createdAt DateTime @default(now()) @db.Timestamp(6)
content String?
published Boolean @default(false)
authorId Int
User User @relation(fields: [authorId], references: [id])
}
model Profile {
id Int @id @default(autoincrement())
bio String?
userId Int @unique
User User @relation(fields: [userId], references: [id])
}
model User {
id Int @id @default(autoincrement())
name String? @db.VarChar(255)
email String @unique @db.VarChar(255)
Post Post[]
Profile Profile?
}
Prisma のデータモデルは、データベーススキーマの宣言型表現であり、生成された Prisma Client ライブラリの基盤として機能します。Prisma Client インスタンスは、これらのモデルに合わせて調整されたクエリを公開します。
現時点では、データモデルにはいくつかの小さな「問題」があります
User
リレーションフィールドは大文字で始まっているため、Prisma の命名規則に準拠していません。より「セマンティクス」を表現するために、このフィールドがUser
とPost
の間の関係をより良く記述するためにauthor
と呼ばれると良いでしょう。User
のPost
およびProfile
リレーションフィールドと、Profile
のUser
リレーションフィールドはすべて大文字で始まっています。Prisma の命名規則に準拠するために、両方のフィールドを小文字のpost
、profile
、およびuser
にする必要があります。- 小文字にした後でも、
User
のpost
フィールドはまだわずかに名前が間違っています。それは、実際には投稿のリストを参照しているためです。したがって、より良い名前は複数形であるposts
になります。
これらの変更は、JavaScript/TypeScript 開発者にとって、小文字のリレーションフィールド author
、posts
、profile
、および user
を使用する方がより自然で慣用的に感じられる、生成された Prisma Client API に関連しています。したがって、Prisma Client API を構成することができます。
リレーションフィールドは仮想であるため (つまり、データベースに直接現れないため)、データベースに触れることなく Prisma スキーマで手動で名前を変更できます
model Post {
id Int @id @default(autoincrement())
title String @db.VarChar(255)
createdAt DateTime @default(now()) @db.Timestamp(6)
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
model Profile {
id Int @id @default(autoincrement())
bio String?
user User @relation(fields: [userId], references: [id])
userId Int @unique
}
model User {
id Int @id @default(autoincrement())
email String @unique @db.VarChar(255)
name String? @db.VarChar(255)
posts Post[]
profile Profile?
}
この例では、データベーススキーマは 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 の構成ページをご覧ください。