概要
Prismaスキーマ(略してschema)は、Prisma ORM設定の主要な構成方法です。以下の部分で構成されています。
- データソース:Prisma ORMが接続するデータソースの詳細を指定します(例:PostgreSQLデータベース)。
- ジェネレーター:データモデルに基づいて生成されるクライアントを指定します(例:Prisma Client)。
- データモデル定義:アプリケーションのモデル(データソースごとのデータの形状)とそのリレーションを指定します。
通常、schema.prisma
という単一のファイル(または.prisma
ファイル拡張子を持つ複数のファイル)であり、定義済みですがカスタマイズ可能な場所に保存されます。
スキーマを複数のファイルに分割したいですか? マルチファイルPrismaスキーマは、Prisma ORM 5.15.0以降のprismaSchemaFolder
プレビュー機能でサポートされています。
スキーマの各セクションの詳細については、PrismaスキーマAPIリファレンス を参照してください。
prisma
コマンドが実行されると、CLIは通常、スキーマからいくつかの情報を読み取ります。例:
prisma generate
:Prismaスキーマから上記のすべての情報を読み取り、正しいデータソースクライアントコード(例:Prisma Client)を生成します。prisma migrate dev
:データソースとデータモデル定義を読み取り、新しいマイグレーションを作成します。
また、CLIコマンドが実行されたときに構成オプションを提供するために、スキーマ内で環境変数を使用することもできます。
例
以下は、指定するPrismaスキーマの例です。
- データソース(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スキーマファイルは、Prisma Schema Language(PSL)で記述されています。詳細と例については、データソース、ジェネレーター、データモデル定義、そしてもちろんPrismaスキーマ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ノードの説明として表示されます。ツールはこれらのコメントを使用して、追加情報を提供できます。すべてのコメントは、次に利用可能なノードに添付されます - free-floating comments はサポートされておらず、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
}
改行はブロックの配置をリセットします
block _ {
key = "value"
key2 = 1
key10 = true
long_key = true
long_key_2 = true
}
フィールド定義は、2つ以上のスペースで区切られた列に揃えられます
block _ {
id String @id
first_name LongNumeric @default
}
複数行のフィールド属性は、残りのフィールド属性と適切に揃えられます
block _ {
id String @id
@default
first_name LongNumeric @default
}
改行はフォーマットルールをリセットします
block _ {
id String @id
@default
first_name LongNumeric @default
}
ブロック属性はブロックの最後にソートされます
block _ {
key = "value"
@@attribute
}