# Prisma (/docs/adapters/prisma)

将 Better Auth 与 Prisma 集成。



Prisma ORM 是一个开源的数据库工具包，通过提供类型安全的查询构建器和直观的数据建模界面，简化了应用程序中的数据库访问和管理。

有关 Prisma ORM 的介绍，请参阅
[Prisma 入门](https://www.prisma.io/docs/getting-started)。

<Callout type="info">
  本指南使用 Prisma 7 和 PostgreSQL。如果您使用的是 Prisma 6 或更早版本，驱动适配器是可选的，您现有的 Prisma Client 设置可以保持不变。
</Callout>

## 安装 [#安装]

要使用 Prisma 适配器，请安装 `@better-auth/prisma-adapter`：

<CodeBlockTabs defaultValue="npm" groupId="persist-install">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npm install @better-auth/prisma-adapter
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm add @better-auth/prisma-adapter
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn add @better-auth/prisma-adapter
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun add @better-auth/prisma-adapter
    ```
  </CodeBlockTab>
</CodeBlockTabs>

以下示例使用 Prisma 7 和 PostgreSQL。如果尚未配置 Prisma，请先按照
[Prisma 的 PostgreSQL 快速入门](https://www.prisma.io/docs/prisma-orm/quickstart/postgresql)
进行操作，然后再继续。

## 设置 [#设置]

以下示例使用下列项目结构：

<Files>
  <File name=".env" />

  <File name="prisma.config.ts" />

  <Folder name="prisma">
    <File name="schema.prisma" />
  </Folder>

  <Folder name="src">
    <Folder name="generated">
      <Folder name="prisma">
        <File name="client.ts" />
      </Folder>
    </Folder>

    <Folder name="lib">
      <File name="prisma.ts" />

      <File name="auth.ts" />
    </Folder>
  </Folder>
</Files>

### 配置 Prisma [#配置-prisma]

如果您要开始一个新的 Prisma 项目，请使用 PostgreSQL 和显式的 Prisma Client 输出路径进行初始化：

<CodeBlockTabs defaultValue="npm" groupId="persist-install">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash title="Initialize Prisma"
    npx prisma init --datasource-provider postgresql --output ../src/generated/prisma
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash title="Initialize Prisma"
    pnpm dlx prisma init --datasource-provider postgresql --output ../src/generated/prisma
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash title="Initialize Prisma"
    yarn dlx prisma init --datasource-provider postgresql --output ../src/generated/prisma
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash title="Initialize Prisma"
    bun x prisma init --datasource-provider postgresql --output ../src/generated/prisma
    ```
  </CodeBlockTab>
</CodeBlockTabs>

这会创建 `prisma/schema.prisma`、`prisma.config.ts` 和 `.env`。在 `.env` 中将
`DATABASE_URL` 设置为您的 PostgreSQL 连接字符串。

如果项目中已经配置了 Prisma，请保留现有的数据源和输出路径，并跳过此初始化命令。

配置输出路径后生成 Prisma Client：

<CodeBlockTabs defaultValue="npm" groupId="persist-install">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash title="Generate Prisma Client"
    npx prisma generate
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash title="Generate Prisma Client"
    pnpm dlx prisma generate
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash title="Generate Prisma Client"
    yarn dlx prisma generate
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash title="Generate Prisma Client"
    bun x prisma generate
    ```
  </CodeBlockTab>
</CodeBlockTabs>

### 创建 Prisma Client [#创建-prisma-client]

从 Prisma 模式中配置的输出路径导入 `PrismaClient`，并将 PostgreSQL 驱动适配器传递给它：

```ts title="src/lib/prisma.ts"
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "../generated/prisma/client";

const databaseUrl = process.env.DATABASE_URL;

if (!databaseUrl) {
  throw new Error("DATABASE_URL is not set");
}

const adapter = new PrismaPg({
  connectionString: databaseUrl,
});

export const prisma = new PrismaClient({ adapter });
```

创建一个 `PrismaClient` 实例，并在整个应用程序中重复使用它。
启用热重载的框架或无服务器运行时可能需要特定于框架的生命周期模式。

### 配置 Better Auth [#配置-better-auth]

将 Prisma Client 实例传递给 Better Auth Prisma 适配器：

```ts title="src/lib/auth.ts"
import { betterAuth } from "better-auth";
import { prismaAdapter } from "better-auth/adapters/prisma";
import { prisma } from "./prisma";

export const auth = betterAuth({
  database: prismaAdapter(prisma, {
    provider: "postgresql",
  }),
});
```

## 模式生成与迁移 [#模式生成与迁移]

[Better Auth CLI](/docs/concepts/cli) 会生成 Better Auth 配置和插件所需的 Prisma 模式。使用 Prisma CLI 根据生成的模式创建并应用迁移。

<table>
  <thead>
    <tr className="border-b">
      <th>
        <p className="font-bold text-[16px] mb-1">
          Prisma 模式生成
        </p>
      </th>

      <th>
        <p className="font-bold text-[16px] mb-1">
          Prisma 模式迁移
        </p>
      </th>
    </tr>
  </thead>

  <tbody>
    <tr className="h-10">
      <td>
        ✅ 支持
      </td>

      <td>
        ❌ 不支持
      </td>
    </tr>
  </tbody>
</table>

<CodeBlockTabs defaultValue="npm" groupId="persist-install">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash title="模式生成"
    npx auth@latest generate
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash title="模式生成"
    pnpm dlx auth@latest generate
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash title="模式生成"
    yarn dlx auth@latest generate
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash title="模式生成"
    bun x auth@latest generate
    ```
  </CodeBlockTab>
</CodeBlockTabs>

Better Auth CLI 会更新您的 Prisma 模式，但不会应用迁移。
使用 Prisma 创建数据库迁移，然后重新生成 Prisma Client：

```bash title="Terminal"
npx prisma migrate dev --name add-better-auth
npx prisma generate
```

## 连接 [#连接]

数据库连接在 Better Auth 需要在单个查询中从多个表获取相关数据时非常有用。
`/get-session`、`/get-full-organization` 以及许多其他端点都能从此功能中大幅受益，
根据数据库延迟的不同，性能提升可达到 2 到 3 倍以上。

Prisma 适配器自 `1.4.0` 版本起开箱即用地支持连接。
要启用此功能，请在您的身份验证配置中将 `advanced.database.joins` 设置为 `true`。

```ts title="auth.ts"
import { betterAuth } from "better-auth";

export const auth = betterAuth({
  advanced: {
    database: {
      joins: true,
    },
  },
});
```

<Callout type="warn">
  请确保您的 Prisma 模式中已定义必要的关联关系。
  如果在您的 Prisma 模式中看不到任何关联关系，您可以使用 `@relation` 指令手动添加，
  或运行我们最新的 CLI 版本 `npx auth@latest generate` 来生成带有关联的 Prisma 模式。
</Callout>

## 其他信息 [#其他信息]

* 如果您正在寻找性能改进或相关技巧，请参阅我们的<Link href="/docs/guides/optimizing-for-performance">性能优化</Link>指南。
* [如何将 Prisma ORM 与 Better Auth 和 Next.js 结合使用](https://www.prisma.io/docs/guides/authentication/better-auth/nextjs)
* [如何将 Prisma ORM 与 Better Auth 和 Astro 结合使用](https://www.prisma.io/docs/guides/authentication/better-auth/astro)

