【问题标题】:Select no fields from table in Korma从 Korma 的表中不选择任何字段
【发布时间】:2014-01-20 19:05:56
【问题描述】:

我正在尝试跨多个表进行联接(三个表加上中间的联接表)。我认为 korma 正在懒惰地评估最后一次加入。我想要做的是添加一个限制连接中第一个表的结果的条件,但我只对连接中最后一个表的字段感兴趣。

例如,假设我有clubspeoplehobbies 表,以及最后两个表的people-to-hobbies 连接表。每个俱乐部可以有很多人,每个人可以有很多爱好。

我正在尝试获取属于特定俱乐部的人的所有爱好的完整详细信息,但我不想要 club 表中的任何字段。连接表意味着 korma 将创建两个查询,一个用于获取特定俱乐部中的所有人员,另一个用于通过 people-to-hobbies 连接表检索该人的爱好。

我的 korma 查询如下所示:

(select clubs
  (with people
    (with hobbies
      (fields :hobby-name :id)
      (where {:clubs.name "korma coders"}))))

问题是我没有指定clubspeople中要哪些字段,默认选择*。我怎样才能不包含这些表中的字段?这是可能的吗,或者hobbies 被延迟加载的事实是否意味着 korma 必须在第一个查询中返回一些结果(这让我得到了一个过滤的人员列表),所以当我稍后来询问它的爱好时,它有运行第二个查询所需的 id?

【问题讨论】:

  • 我不得不选择额外的字段并在 Clojure 中将它们过滤掉,这似乎很遗憾 - 这意味着我正在通过我的数据库连接传送我不需要的额外数据。因此,虽然我已经解决了这个问题,但它在我的代码中引入了额外的复杂性,并在我的网络上增加了额外的负载。

标签: clojure korma sqlkorma


【解决方案1】:

在这种情况下我会使用join 宏:

(select clubs
  (join people)
  (join people-to-hobbies)
  (join hobbies)
  (fields :hobbies.hobby-name :hobbies.id)
  (where {:clubs.name "korma coders"}))))

它更明确一点,但作为一个额外的好处,它可以通过单个查询运行。

【讨论】:

  • 啊,看起来好多了,我试试看。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 2023-03-25
  • 2011-01-28
  • 1970-01-01
  • 2011-01-13
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多