我怎样才能让这个查询返回不同的资源:
const similarGuides = await db
.select({
resourceId: embeddings.resourceId,
title: resources.title,
content: resources.content,
type: resources.type,
iconPath: integrations.iconPath,
name: integrations.name,
similarity,
})
.from(embeddings)
.innerJoin(resources, eq(embeddings.resourceId, resources.id))
.innerJoin(integrations, eq(resources.integrationId, integrations.id))
.where(gt(similarity, 0.5))
.orderBy(t => desc(t.similarity))
.limit(4);
我认为解决方案应该是直接的,但我尝试的一切最终都会导致另一个错误。我希望得到一些建议。
我想到了一些事情。
const takeUniqueOrThrow = <T extends any[]>(values: T): T[number] => {
if (values.length !== 1) throw new Error("Found non unique or inexistent value")
return values[0]!
}
function foo(id: string){
return await db.select().from(model).where(eq(model.id,id)).then(takeUniqueOrThrow)
}
这是一种非常好的通用方法,使用
select
API。
findFirst
,根据文档,“.findFirst() 将为查询添加限制 1。”function foo(id: string){
return await db.query.model.findFirst({ where: eq(model.id, id) })
}
通过
query
API。与此密切相关的是
.findMany
,只需取第一个索引即可,function foo(id: string){
const arr = await db.query.model.findMany({ where: eq(model.id, id) })
if(arr !== 0) throw new Error("Found non unique or inexistent value")
return arr[0]
}
drizzle
的哲学,我相信 - 尽管尚未检查 - 他们都在运行某种形式的此 sql 查询(这是获取条目的唯一方法)SELECT *
FROM table_name
WHERE unique_column = 'value'
这也意味着你可以直接跑
await db.execute(sql`select * from ${model} where ${model.id} = ${id}`)
这些方法中的任何一种都有效,而且它们在性能上似乎都大致相当(请有人对我进行事实核查)。另外,我已经用
测试了这些$ pnpm drizzle-kit --version
drizzle-kit: v0.24.2
drizzle-orm: v0.33.0