如何在Korma中选择默认字段



假设您已经完成了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))

相关内容

  • 没有找到相关文章

最新更新