假设您已经完成了DEFDB。我有一个表"项目",其中有两个字段," ID"(PK)和"项目"。我想设置一个实体,以便每当我选择它时,我只会在"项目"中获取条目。从文档来看,我认为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
做我想做的事?
我认为您无法从defentity
做到这一点 - 选择的方式在不明确传递字段列表的情况下,只是select *
。
基于korma/select的助手麦克罗呢:
(defmacro select-without-id
[ent & body]
`(let [query# (-> (korma/select* ~ent)
(korma/fields (vec (:fields ~ent)))
~@body)]
(korma/exec query#)))
id
是korma中的defauld pk列名称。这就是为什么您在结果列表中看到它的原因。您可以使用transform
定义来删除它:
(korma/defentity items
(korma/entity-fields :item)
(korma/transform #(dissoc % :id)))
尝试创建一个具有以下依赖项的新名称空间:
(ns yourproject.path.kormastuff
(:use [korma.core]
[korma.db]))
然后创建您的实体:
(defentity items
(entity-fields :item))
我认为您可能会撞墙,因为您试图使核心别名,而您缺少DB。将这些内容推入自己的文件并调用您想要的查询,如果选择其他名称空间,则最好将这些内容推入您想要的查询,即:
:(ns project.core
(:use [project.path.kormastuff :as kormadb]))
然后:
(select kormadb/items)
获得您的结果。那应该起作用。
在补给中,只需输入
items
进入命令提示,查看输出Korma将为您提供。不应出现其他字段。如果您在REPL中运行(选择项目),那么无论您是否希望发生这种情况,都会显示所有内容。要获得真实的输出,您可能必须在浏览器窗口或其他内容中执行(格式"%s"项目)。
如果所有这些都无法使用,则使用普通(选择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,您需要破坏上述哈希映射。我会把它作为一个练习供你学习't丢失错误:
(let [{myAlias :fields} myQuery]
(format "%s" myAlias))