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 实例以确保整个项目中只创建一个实例,然后根据需要从任何文件导入它。这种方法避免了每次使用 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/[email protected]
或更高版本。有关更多信息,请参见下面的 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 兼容性指南。
原始的数据库 Edge 运行时解决方法(将您的 auth.ts
配置分成两个)将在下面保留。
旧的 Edge 解决方法
目前,Prisma 仍在努力与 Vercel 的 Edge 运行时完全兼容。查看此处跟踪的问题 此处,以及 Prisma 关于 5.9.1
中早期 Edge 支持的公告 变更日志。有两个选项可以解决此问题
使用 Prisma 与 jwt
会话策略和 @prisma/[email protected]
或更高版本无需进行任何其他修改,只需确保您在中间件中不进行任何数据库查询。
自从 @prisma/[email protected]
之后,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
开发工作流程
当您正在开发应用程序并对数据库模式进行更改时,每次对模式进行更改时都需要重新运行 migrate 命令,以便 Prisma 可以 (1) 生成迁移文件并将其应用于底层数据库,以及 (2) 使用最新的类型和模型方法重新生成项目中的 Prisma 客户端。
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")
}