我正在从 NestJS-TypeORM 背景过渡到 Drizzle ORM :
db.query()
返回结构良好的嵌套数据(例如,用户及其帖子分组在一起)。查询生成器 (db.select()
) 返回原始、扁平化的数据,需要额外处理才能实现类似的结构。示例: db.查询结果:
[{
"id": 10,
"name": "Dan",
"posts": [
{
"id": 1,
"content": "SQL is awesome",
"authorId": 10
},
{
"id": 2,
"content": "But check relational queries",
"authorId": 10
}
]
}]
查询生成器结果:
const result: {
user: { id: number; name: string };
pets: { id: number; name: string; ownerId: number } | null;
}[] = await db
.select()
.from(users)
.leftJoin(pets, eq(users.id, pets.ownerId));
我正在寻找一种机制或最佳实践,将查询生成器结果映射为嵌套格式(类似于 db.query),以便我的 API 响应保持一致,并且客户端不需要检查不同的格式。
您对此有何建议、模式或库?您如何在基于 Drizzle 的项目中处理这个问题?
提前致谢!
在 Drizzle 中,
db.query
用作全阶段 ORM,而 db.select
提供轻量级查询构建器。虽然你可能会遇到一些问题,但它的运行速度要快得多。
这是您的查询的更正版本:
import { eq, getTableColumns } from 'drizzle-orm';
await db
.select({
...getTableColumns(users),
pets: sql<{ id: number; name: string; ownerId: number }[]>`
COALESCE(
json_agg(
json_build_object(
'id', ${pets}.id,
'name', ${pets}.name,
'ownerId', ${pets}.ownerId
)
)
filter (WHERE ${pets}.id IS NOT NULL), '[]'
`
})
.from(users)
.leftJoin(pets, eq(users.id, pets.ownerId));
注意
db.select
不支持多层嵌套;它只允许嵌套一层。