假设您已经完成了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
做我想做的事?
答案 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))