Clojure 如何在korma中选择默认字段?

Clojure 如何在korma中选择默认字段?,clojure,korma,Clojure,Korma,假设您已经完成了一个defdb。我有一个表“items”,它有两个字段,“id”(PK)和“item”。我想设置一个实体,这样每当我选择它时,我只会得到“item”中的条目。根据我的判断,korma/entity字段就是这样做的 (require '[korma.core :as korma]) (korma/defentity items (korma/entity-fields :item)) (korma/select items) ;; Wanted: [{:item "foo"

假设您已经完成了一个defdb。我有一个表“items”,它有两个字段,“id”(PK)和“item”。我想设置一个实体,这样每当我选择它时,我只会得到“item”中的条目。根据我的判断,
korma/entity字段
就是这样做的

(require '[korma.core :as korma])

(korma/defentity items
  (korma/entity-fields :item))

(korma/select items)
;; Wanted: [{:item "foo"}]
;; Received: [{:id 1, :item "foo"}]

我使用的是korma 0.3.0-beta7。如何使
korma/select
做我想做的事?

id
是korma中的defauld PK列名。这就是为什么您会在结果列表中看到它。您可以使用
transform
definition将其删除:

(korma/defentity items
  (korma/entity-fields :item)
  (korma/transform #(dissoc % :id)))

我认为您无法从
防御机制中做到这一点--select在不显式传递字段列表的情况下工作的方式就是
select*

基于korma/select的helper宏如何:

(defmacro select-without-id
  [ent & body]
  `(let [query# (-> (korma/select* ~ent)
                (korma/fields (vec (:fields ~ent)))
                 ~@body)]
     (korma/exec query#)))

尝试创建具有以下依赖项的新命名空间:

(ns yourproject.path.kormastuff
    (:use [korma.core]
          [korma.db]))
然后创建实体,如下所示:

(defentity items
  (entity-fields :item))
我认为您可能遇到了问题,因为您试图对核心进行别名,但却缺少db。最好将这些内容放入自己的文件中,并从其他名称空间调用您想要的查询,如果您愿意,可以使用别名,例如:

(ns project.core
    (:use [project.path.kormastuff :as kormadb]))
然后:

为了得到你的结果。这应该行得通

在REPL中,只需输入

items 
进入命令提示符查看Korma将给您的输出。不应显示其他字段。如果您在REPL中运行(选择项),它将显示所有内容,无论您是否希望这样做。要获得真正的输出,您可能必须在浏览器窗口中执行(格式化“%s”项)或其他操作

如果所有这些都不起作用,那么使用normal(selectdb(fields[:item])子句也没什么丢脸的。你会发现,无论如何,你都会被迫去破坏结构来使用这些信息

编辑:

对不起,我没有解释清楚

你不应该这样做

(select kormadb/items) 
得到你想要的。您只需要调用实体本身,因此只需要调用REPL中的项,而不需要调用REPL中的(选择项)

你会想做一些像

(def myQuery kormadb/items)

$ myQuery
您将看到默认情况下没有选择其他字段

你也可以

(let [myQuery kormadb/items] 
    (format "%s" myQuery))
我在这里修改,但得到的结果与此类似:

{:table "items", :name "items", :pk :id, :db nil, :transforms (), :prepare
s (), :fields ("\"items\".\"item\""), :rel {}}
为了使用myQuery,您需要对上面的哈希映射进行分解。我将把它作为一个练习留给你去学习,因为除非你自己动手,否则解构很重要也很难学,但我会给你一个小的起点,它不会给你答案,但也不会抛出错误:

(let [{myAlias :fields} myQuery]
    (format "%s" myAlias))

如果将我的示例更改为
(korma/entity fields:id)
,您仍然会得到相同的结果(即:项仍然在结果中)。您的答案是不正确的,尽管转换确实可以用来删除不需要的键。您知道“实体字段”的作用是什么吗?文档说“在实体的select查询中设置默认要检索的字段。”也许我完全不喜欢,但我不知道它是如何做到的。它似乎定义了实体的字段(表中的列)。除非您将
(字段)
发送到
(选择)
,否则它看起来就像是在
选择项目。*
。我添加了一个可能适用于您的helper宏。我有点像科玛·努伯,所以不要把我说的任何话当作福音。你说的别名a核心是什么意思,你说的错过db是什么意思?我只是按照你的建议用“使用”和单独的文件设置了一个项目,得到了和以前一样的结果。你能确认当你做
(选择kormadb/items)
时,你只得到item列吗?我在答案中添加了更多的说明。我想我已经给了你很多了。我强烈建议您只使用(选择项(字段…),因为它应该更容易。
(let [{myAlias :fields} myQuery]
    (format "%s" myAlias))