SQL 与 ORM
SQL 数据库因将应用数据持久化存储而广受欢迎。你可以在 AdonisJS 应用中使用任意库和 ORM 来执行 SQL 查询。
AdonisJS 核心团队构建了 Lucid ORM,但并不会强制你使用它。你可以在 AdonisJS 应用中使用任何你喜欢的 SQL 库和 ORM。
常用选项
以下是在 AdonisJS 应用中(与在任何其他 Node.js 应用中一样)可以使用的其他常用 SQL 库和 ORM 列表。
- Lucid 是由 AdonisJS 核心团队创建并维护的 SQL 查询构建器,建立在 Knex 之上的Active Record ORM(活动记录 ORM)。
- Prisma Prisma ORM 是 Node.js 生态中另一款流行的 ORM,拥有庞大的社区用户群。它提供直观的数据模型、自动化迁移、类型安全与自动补全。
- Kysely 是面向 Node.js 的端到端类型安全查询构建器。如果你需要一个不带任何模型的轻量查询构建器,Kysely 是很好的选择。我们写过一篇文章讲解如何在 AdonisJS 应用中集成 Kysely。
- Drizzle ORM 被社区中许多 AdonisJS 开发者所使用。我们没有使用过这款 ORM 的经验,但你可以尝试一下,看看它是否非常适合你的使用场景。
- Mikro ORM 是 Node.js 生态中被低估的 ORM。与 Lucid 相比,MikroORM 略显冗长。不过,它处于活跃维护状态,并且同样构建于 Knex 之上。
- TypeORM 是 TypeScript 生态中一款流行的 ORM。
使用其他 SQL 库和 ORM
使用其他 SQL 库或 ORM 时,你需要手动更改某些软件包的配置。
身份认证
AdonisJS 身份认证模块 内置了对 Lucid 的支持,用于获取已认证的用户。使用其他 SQL 库或 ORM 时,你需要实现 SessionUserProviderContract 或 AccessTokensProviderContract 接口来获取用户。
以下是使用 Kysely 时如何实现 SessionUserProviderContract 接口示例。
import { symbols } from '@adonisjs/auth'
import type { SessionGuardUser, SessionUserProviderContract } from '@adonisjs/auth/types/session'
import type { Users } from '../../types/db.js' // 特定于 Kysely
export class SessionKyselyUserProvider implements SessionUserProviderContract<Users> {
/**
* 供事件发射器使用,为会话守卫发出的事件添加类型信息。
*/
declare [symbols.PROVIDER_REAL_USER]: Users
/**
* 会话守卫与你的提供器之间的桥接。
*/
async createUserForGuard(user: Users): Promise<SessionGuardUser<Users>> {
return {
getId() {
return user.id
},
getOriginal() {
return user
},
}
}
/**
* 使用你的自定义 SQL 库或 ORM,通过用户 id 查找用户。
*/
async findById(identifier: number): Promise<SessionGuardUser<Users> | null> {
const user = await db
.selectFrom('users')
.selectAll()
.where('id', '=', identifier)
.executeTakeFirst()
if (!user) {
return null
}
return this.createUserForGuard(user)
}
}
一旦你实现了 UserProvider 接口,就可以在配置中使用它。
const authConfig = defineConfig({
default: 'web',
guards: {
web: sessionGuard({
useRememberMeTokens: false,
provider: sessionUserProvider({
model: () => import('#models/user'),
}),
provider: configProvider.create(async () => {
const { SessionKyselyUserProvider } = await import(
'../app/auth/session_user_provider.js' // 文件路径
)
return new SessionKyselyUserProvider()
}),
}),
},
})