Prismaアダプター
リソース
セットアップ
インストール
npm install @prisma/client @auth/prisma-adapter
npm install prisma --save-dev
環境変数
データベースへの接続とデータ取得のため、Prismaは環境変数の設定が必要です。Prismaは接続確立にDATABASE_URL
環境変数を使用します。詳細は、ドキュメントを参照してください。
DATABASE_URL=postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA
設定
Prisma ORM
のパフォーマンスを向上させるために、プロジェクト全体でPrismaインスタンスが1つだけ作成されるように設定し、必要に応じて任意のファイルからインポートすることができます。これにより、PrismaClientのインスタンスを毎回再作成する必要がなくなります。auth.ts
ファイルの設定からPrismaインスタンスをインポートできます。
import { PrismaClient } from "@prisma/client"
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient }
export const prisma = globalForPrisma.prisma || new PrismaClient()
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma
ミドルウェアまたはその他のEdgeランタイムを使用する場合は、バージョン@prisma/client@5.12.0
以上を使用することをお勧めします。詳細については、下記のEdgeとの互換性を参照してください。
import NextAuth from "next-auth"
import { PrismaAdapter } from "@auth/prisma-adapter"
import { prisma } from "@/prisma"
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: PrismaAdapter(prisma),
providers: [],
})
Edgeとの互換性
Prismaはバージョン5.12.0
でEdgeランタイムサポートを提供しました。Edgeドキュメントで詳細を確認できます。特定のデータベースドライバが必要なため、特定の種類のデータベース/ホスティングプロバイダーとのみ互換性があります。開始する前に、サポートされているドライバの一覧を確認してください。next-auth
とPrismaを使用してEdge環境で動作するAuth.jsアプリケーションの例はこちらにあります。
Edgeとの互換性に関する詳細については、Edge互換性ガイドを参照してください。
auth.ts
設定を2つのファイルに分割する、元のデータベースEdgeランタイム対応策を以下に示します。
旧Edge対応策
現在、PrismaはVercelなどのEdgeランタイムとの完全な互換性はまだ開発中です。追跡中の問題、および5.9.1
の変更ログにおけるPrismaによる早期Edgeサポートに関する発表を参照してください。この問題に対処するには、2つのオプションがあります。
- PrismaのAccelerate機能を使用する
- 対応策としてEdge互換性ページに従う。これは
jwt
セッション戦略を使用し、auth.ts
設定を2つのファイルに分割します。
jwt
セッション戦略と@prisma/client@5.9.1
以上をPrismaで使用する場合、ミドルウェアでデータベースクエリを実行しないことを確認する以外に追加の変更は必要ありません。
@prisma/client@5.9.1
以降、Prismaはインスタンス化時ではなくクエリ実行時にEdgeランタイムとの非互換性に関するエラーをスローします。したがって、ミドルウェアで使用されているファイルにインポートすることが可能です。ただし、ミドルウェア内でクエリを実行しないでください。
スキーマ
Prisma 2.26.0
以上が必要です。prisma/schema.prisma
に次のモデルを含むスキーマファイルを作成します。
スキーマの適用
これにより、SQLマイグレーションファイルが作成され、実行されます。
npm exec prisma migrate dev
データベース接続文字列をDATABASE_URL
環境変数で指定する必要があることに注意してください。これは、プロジェクトルートの.env
ファイルで設定できます。Prismaは.env.local
構文をサポートしていないため、.env
という名前である必要があります。詳細は、環境変数に関するドキュメントを参照してください。
Prismaクライアントの生成
prisma migrate dev
は Prisma クライアントも生成しますが、手動で再生成する必要がある場合は、次のコマンドを実行できます。
npm exec prisma generate
開発ワークフロー
アプリケーションを開発し、データベーススキーマを変更する際には、Prisma が (1) マイグレーションファイルの生成と基盤となるデータベースへの適用、および (2) 最新の型とモデルメソッドを含む Prisma クライアントのプロジェクトへの再生成を行うため、スキーマに変更を加えるたびに migrate コマンドを実行する必要があります。
npm exec prisma migrate dev
命名規則
混合した snake_case
と camelCase
のカラム名が問題となる場合、または基盤となるデータベースシステムとの互換性のために、Prisma の @map()
機能 を使用してフィールド名を変更することをお勧めします。これは Auth.js には影響しませんが、好みの命名規則に合わせてカラム名をカスタマイズできます。
たとえば、snake_case
と複数形テーブル名への移行などです。
model Account {
id String @id @default(cuid())
userId String @map("user_id")
type String
provider String
providerAccountId String @map("provider_account_id")
refresh_token String? @db.Text
access_token String? @db.Text
expires_at Int?
token_type String?
scope String?
id_token String? @db.Text
session_state String?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([provider, providerAccountId])
@@map("accounts")
}
model Session {
id String @id @default(cuid())
sessionToken String @unique @map("session_token")
userId String @map("user_id")
expires DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("sessions")
}
model User {
id String @id @default(cuid())
name String?
email String? @unique
emailVerified DateTime? @map("email_verified")
image String?
accounts Account[]
sessions Session[]
@@map("users")
}
model VerificationToken {
identifier String
token String
expires DateTime
@@unique([identifier, token])
@@map("verification_tokens")
}