Prisma Schemaの概要
Prisma Schema(略してschema)は、Prisma ORMのセットアップにおける主要な設定方法です。以下の部分で構成されています
- データソース: Prisma ORMが接続すべきデータソースの詳細を指定します(例:PostgreSQLデータベース)
- ジェネレーター: データモデルに基づいて生成されるクライアントを指定します(例:Prisma Client)
- データモデル定義: アプリケーションのモデル(データソースごとのデータの形状)とそのリレーションを指定します
通常、schema.prisma
という単一のファイル(または.prisma
ファイル拡張子を持つ複数のファイル)で、定義済みだがカスタマイズ可能な場所に保存されます。必要であれば、Prismaスキーマを複数のファイルに整理することもできます。
スキーマの各セクションの詳細については、PrismaスキーマAPIリファレンスを参照してください。
prisma
コマンドが呼び出されるたびに、CLIは通常、スキーマからいくつかの情報を読み取ります。例:
prisma generate
: 正しいデータソースクライアントコード(例:Prisma Client)を生成するために、Prismaスキーマから上記のすべての情報を読み取ります。prisma migrate dev
: 新しいマイグレーションを作成するために、データソースとデータモデル定義を読み取ります。
CLIコマンドが呼び出されたときに構成オプションを提供するために、スキーマ内で環境変数を使用することもできます。
例
以下は、指定するPrisma Schemaの例です
- データソース(PostgreSQLまたはMongoDB)
- ジェネレーター(Prisma Client)
- 2つのモデル(1つのリレーションを含む)と1つの
enum
を持つデータモデル定義 - 複数のネイティブデータ型属性(
@db.VarChar(255)
,@db.ObjectId
)
- リレーショナルデータベース
- MongoDB
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
email String @unique
name String?
role Role @default(USER)
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
published Boolean @default(false)
title String @db.VarChar(255)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
enum Role {
USER
ADMIN
}
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
createdAt DateTime @default(now())
email String @unique
name String?
role Role @default(USER)
posts Post[]
}
model Post {
id String @id @default(auto()) @map("_id") @db.ObjectId
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
published Boolean @default(false)
title String
author User? @relation(fields: [authorId], references: [id])
authorId String @db.ObjectId
}
enum Role {
USER
ADMIN
}
構文
Prisma SchemaファイルはPrisma Schema Language (PSL)で記述されています。詳細と例については、データソース、ジェネレーター、データモデル定義、そしてもちろんPrisma Schema APIリファレンスの各ページを参照してください。
VS Code
PSLのシンタックスハイライトは、VS Code拡張機能で利用できます(これにより、Prismaスキーマのコンテンツを自動フォーマットしたり、赤い波線で構文エラーを表示したりすることもできます)。エディターでPrisma ORMをセットアップする方法について詳しく学んでください。
GitHub
GitHub上のPSLコードスニペットも、.prisma
ファイル拡張子を使用するか、Markdownのフェンス付きコードブロックにprisma
と注釈を付けることで、シンタックスハイライト付きでレンダリングできます。
```prisma
model User {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
email String @unique
name String?
}
```
スキーマからの環境変数へのアクセス
CLIコマンドが呼び出されるとき、またはPrisma Clientクエリが実行されるときに、環境変数を使用して構成オプションを提供できます。
スキーマにURLを直接ハードコーディングすることは可能ですが、セキュリティリスクを伴うため推奨されません。スキーマで環境変数を使用すると、スキーマから機密情報を分離することができ、これにより異なる環境でスキーマを使用できるようになるため、スキーマのポータビリティが向上します。
環境変数はenv()
関数を使用してアクセスできます
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
env()
関数は以下の場所で使用できます
- データソースURL
- ジェネレーターバイナリターゲット
開発中に.env
ファイルを使用する方法の詳細については、環境変数を参照してください。
コメント
Prisma Schema Languageでは、2種類のコメントがサポートされています
// comment
: このコメントは読者の理解を助けるためのものであり、スキーマの抽象構文木(AST)には存在しません。/// comment
: これらのコメントは、スキーマの抽象構文木(AST)にASTノードの説明として表示されます。ツールはこれらのコメントを使用して追加情報を提供できます。すべてのコメントは次の利用可能なノードに添付されます — 自由な位置のコメントはサポートされておらず、ASTには含まれません。
いくつかの異なる例を以下に示します
/// This comment will get attached to the `User` node in the AST
model User {
/// This comment will get attached to the `id` node in the AST
id Int @default(autoincrement())
// This comment is just for you
weight Float /// This comment gets attached to the `weight` node
}
// This comment is just for you. It will not
// show up in the AST.
/// This comment will get attached to the
/// Customer node.
model Customer {}
自動フォーマット
Prisma ORMは.prisma
ファイルの自動フォーマットをサポートしています。.prisma
ファイルをフォーマットするには、2つの方法があります
prisma format
コマンドを実行します。- Prisma VS Code拡張機能をインストールし、VS Codeのフォーマットアクションを手動または保存時に呼び出します。
設定オプションはありません — フォーマットルールは固定されています(Golangのgofmt
に似ていますが、Javascriptのprettier
とは異なります)
フォーマットルール
設定ブロックは=
記号で整列されます
block _ {
key = "value"
key2 = 1
long_key = true
}
フィールド定義は2つ以上のスペースで区切られた列に整列されます
block _ {
id String @id
first_name LongNumeric @default
}
空行はブロックの整列とフォーマットルールをリセットします
block _ {
key = "value"
key2 = 1
key10 = true
long_key = true
long_key_2 = true
}
block _ {
id String @id
@default
first_name LongNumeric @default
}
複数行のフィールド属性は、他のフィールド属性と適切に整列されます
block _ {
id String @id
@default
first_name LongNumeric @default
}
ブロック属性はブロックの最後にソートされます
block _ {
key = "value"
@@attribute
}