在 Drizzle Postgresql 中选择不同的

问题描述 投票:0回答:1

我怎样才能让这个查询返回不同的资源:

 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);

我认为解决方案应该是直接的,但我尝试的一切最终都会导致另一个错误。我希望得到一些建议。

postgresql drizzle
1个回答
0
投票

我想到了一些事情。

  1. 在 github 上找到这个解决方案
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。

  1. 使用
    findFirst
    根据文档,“.findFirst() 将为查询添加限制 1。”
function foo(id: string){
    return await db.query.model.findFirst({ where: eq(model.id, id) })
}

通过

query
API。与此密切相关的是

  1. 意味着您可以使用
    .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]
}
  1. 鉴于
    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 
© www.soinside.com 2019 - 2024. All rights reserved.