PostgreSQL

将 Better Auth 与 PostgreSQL 集成。

PostgreSQL 是一个强大的开源关系型数据库管理系统,以其高级功能、可扩展性以及对复杂查询和大型数据集的支持而闻名。 点击这里了解更多。

示例用法

确保你已安装并配置好 PostgreSQL。 然后,你可以直接将其连接到 Better Auth。

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

export const auth = betterAuth({
  database: new Pool({
    connectionString: "postgres://user:password@localhost:5432/database",
  }),
});

更多信息请阅读 Kysely 关于 PostgresDialect 的文档。

模式生成与迁移

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

PostgreSQL 模式生成

PostgreSQL 模式迁移

✅ 支持✅ 支持
npx auth@latest migrate
npx auth@latest generate

连接查询(实验性)

当 Better-Auth 需要在单个查询中从多个表获取相关数据时,数据库连接查询非常有用。 类似 /get-session/get-full-organization 等端点极大地受益于此功能, 根据数据库延迟,性能可提升 2 到 3 倍。

Kysely PostgreSQL 方言自 1.4.0 版本起原生支持连接查询。 要启用此功能,需要在 auth 配置中将 experimental.joins 选项设为 true

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

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

启用此功能后,可能需要执行数据库迁移。

使用非默认模式

在大多数情况下,默认模式是 public。若希望 Better Auth 使用非默认模式(例如 auth)存放其表,有几种方式:

选项 1:在连接字符串中设置 search_path(推荐)

在连接 URI 后追加 options 参数:

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

export const auth = betterAuth({
  database: new Pool({
    connectionString: "postgres://user:password@localhost:5432/database?options=-c search_path=auth",
  }),
});

需要时请进行 URL 编码:?options=-c%20search_path%3Dauth

选项 2:通过 Pool 配置设置 search_path

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

export const auth = betterAuth({
  database: new Pool({
    host: "localhost",
    port: 5432,
    user: "postgres",
    password: "password",
    database: "my-db",
    options: "-c search_path=auth",
  }),
});

选项 3:为数据库用户设置默认模式

设置 PostgreSQL 用户的默认模式:

ALTER USER your_user SET search_path TO auth;

设置后需要重新连接以应用更改。

先决条件

使用非默认模式之前,请确保:

  1. 该模式已存在:

    CREATE SCHEMA IF NOT EXISTS auth;
  2. 用户具备相应权限:

    GRANT ALL PRIVILEGES ON SCHEMA auth TO your_user;
    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA auth TO your_user;
    ALTER DEFAULT PRIVILEGES IN SCHEMA auth GRANT ALL ON TABLES TO your_user;

工作原理

Better Auth CLI 迁移系统会自动检测你配置的 search_path

  • 执行 npx auth migrate 时,只检查配置模式中的表
  • 其他模式(如 public)中的表会被忽略,避免冲突
  • 所有新表都会创建在你指定的模式中

故障排查

问题:迁移时出现 "relation does not exist" 错误

解决方案: 通常表示该模式不存在或用户权限不足。请按上述方式创建模式并授予权限。

验证你的模式配置:

你可以通过查询 search_path 来检查 Better Auth 使用的模式:

SHOW search_path;

结果应显示你的自定义模式(例如 auth)为第一个值。

其他信息

PostgreSQL 的支持是通过 Kysely 适配器实现的,Kysely 支持的任何数据库也均受支持。(点击这里了解更多)

如果你在寻求性能提升或优化技巧,可以查看我们的 性能优化指南