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

时间:2012-10-25 14:33:59

标签: clojure korma

假设您已经完成了defdb。我有一个表“items”,它有两个字段,“id”(PK)和“item”。我想设置一个实体,这样每当我选择它时,我只能获得“item”中的条目。根据{{​​3}}我认为korma/entity-fields是这样做的方法。

(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做我想做的事?

3 个答案:

答案 0 :(得分:1)

我认为你不能从defentity做到这一点 - 选择工作方式而不明确传递字段列表只是select *

基于korma / select的辅助宏怎么样:

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

答案 1 :(得分:0)

id是Korma中的默认PK列名。这就是你在结果列表中看到它的原因。您可以使用transform定义删除它:

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

答案 2 :(得分:0)

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

(ns yourproject.path.kormastuff
    (:use [korma.core]
          [korma.db]))

然后创建您的实体:

(defentity items
  (entity-fields :item))

我认为你可能会碰到一堵墙,因为你正试图为一个核心做别名而你错过了这个数据库。将这些内容推送到自己的文件并调用所需的查询,如果您选择了别名,从其他名称空间调用,则更好:

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

然后:

(select kormadb/items)

获得结果。这应该工作。

在REPL中,只需输入

即可
items 

进入命令提示符,看看Korma会给你的输出。应该没有其他字段出现。如果您在REPL中运行(选择项目),它将显示所有内容,无论您是否希望发生这种情况。要获得实际输出,您可能需要在浏览器窗口或其他内容中执行(格式化“%s”项)。

如果所有这些都不起作用,那么使用普通(select db(fields [:item]))子句并不羞耻。你会发现你将被迫去构造以使用这些信息。

EDIT :::::::

对不起,我没有清楚地解释自己。

你不应该这样做

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