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 适配器连接你的数据库。
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。
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,
}),
});额外信息
- 若你正在寻找性能提升建议或技巧,请查看我们的 性能优化指南。