Drizzle ORM 适配器

将 Better Auth 与 Drizzle ORM 集成。

Drizzle ORM 是一个功能强大且灵活的 Node.js 和 TypeScript ORM。它提供了一个简单直观的 API 来操作数据库,支持包括 MySQL、PostgreSQL、SQLite 等多种数据库。

在开始之前,请确保你已经安装并配置了 Drizzle。更多信息请参见 Drizzle 文档

安装

要使用 Drizzle 适配器,你需要安装 @better-auth/drizzle-adapter 包:

npm install @better-auth/drizzle-adapter

示例用法

你可以按如下方式使用 Drizzle 适配器连接你的数据库。

auth.ts
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { db } from "./database.ts";

export const auth = betterAuth({
  database: drizzleAdapter(db, { 
    provider: "sqlite", // 或者 "pg" 或 "mysql"
  }), 
  //... 你的其他配置
});

模式生成与迁移

Better Auth CLI 允许你根据 Better Auth 配置和插件来生成或迁移数据库模式。

生成 Better Auth 所需的数据库模式,运行以下命令:

npx auth@latest generate

生成并应用迁移,运行以下命令:

npx drizzle-kit generate # 生成迁移文件
npx drizzle-kit migrate # 应用迁移

关联查询(实验性)

数据库关联查询在 Better Auth 需要从多个表中一次性获取相关数据时非常有用。 像 /get-session/get-full-organization 等端点都能从此功能获得显著提升, 根据数据库延迟,性能提升可达 2 倍到 3 倍。

1.4.0 版本起,Drizzle 适配器开箱即用支持关联查询。 要启用此功能,需要在你的 auth 配置中将 experimental.joins 选项设置为 true

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

export const auth = betterAuth({
  experimental: { joins: true }
});

请确保你的 Drizzle 模式定义了必要的关联关系。 如果你在 Drizzle 模式中没有看到任何关联关系,可以使用 relation 函数手动添加关联, 或运行最新版本的 CLI 命令 npx auth@latest generate 生成包含关联的 Drizzle 模式。

此外,你需要将每个关联关系通过 drizzle 适配器的模式对象传入。

修改表名

Drizzle 适配器期望你定义的模式与表名一致。例如,如果 Drizzle 模式将 user 表映射为 users,你需要手动传入模式并映射到 user 表。

import { betterAuth } from "better-auth";
import { db } from "./drizzle";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { schema } from "./schema";

export const auth = betterAuth({
  database: drizzleAdapter(db, {
    provider: "sqlite", // 或 "pg" 或 "mysql"
    schema: { 
      ...schema, 
      user: schema.users, 
    }, 
  }),
});

你可以像上例这样修改提供的模式值, 也可以直接修改 auth 配置的 modelName 属性。 例如:

import { betterAuth } from "better-auth";

export const auth = betterAuth({
  database: drizzleAdapter(db, {
    provider: "sqlite", // 或 "pg" 或 "mysql"
    schema,
  }),
  user: {
    modelName: "users", 
  }
});

修改字段名

我们基于你传入 Drizzle 模式的属性映射字段名。 例如,如果你想将 email 字段修改为 email_address, 只需修改 Drizzle 模式为:

export const user = mysqlTable("user", {
  // 修改字段名但不改变模式属性名
  // 这样 Drizzle 和 Better Auth 仍使用原始字段名,
  // 而数据库使用修改后的字段名
  email: varchar("email_address", { length: 255 }).notNull().unique(), 
  // ... 其他字段
});

你可以像上例一样修改 Drizzle 模式, 也可以直接修改 auth 配置的 fields 属性。 例如:

import { betterAuth } from "better-auth";

export const auth = betterAuth({
  database: drizzleAdapter(db, {
    provider: "sqlite", // 或 "pg" 或 "mysql"
    schema,
  }),
  user: {
    fields: {
      email: "email_address", 
    }
  }
});

使用复数表名

如果你的所有表名都是复数形式,你可以直接传入 usePlural 选项:

import { betterAuth } from "better-auth";

export const auth = betterAuth({
  database: drizzleAdapter(db, {
    ...
    usePlural: true, 
  }),
});

额外信息

  • 若你正在寻找性能提升建议或技巧,请查看我们的 性能优化指南