假设您已经创建了defdb。我有一个表"items“,它有两个字段,"id”(PK)和"item“。我想设置一个实体,这样每当我选择它时,我只会得到"item“中的条目。根据documentation的判断,我认为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做我想做的事呢?
发布于 2012-10-26 01:57:52
我不认为在defentity中可以做到这一点-- select的工作方式只有select *,而不显式地传递字段列表。
基于korma/select的帮助器宏如何:
(defmacro select-without-id
[ent & body]
`(let [query# (-> (korma/select* ~ent)
(korma/fields (vec (:fields ~ent)))
~@body)]
(korma/exec query#)))发布于 2012-10-26 01:22:50
id是Korma中默认的主键列名。这就是为什么你会在结果列表中看到它。您可以使用transform definition删除它:
(korma/defentity items
(korma/entity-fields :item)
(korma/transform #(dissoc % :id)))发布于 2012-10-31 13:30:12
尝试创建具有以下依赖项的新命名空间:
(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)来得到你的结果。这应该行得通。
在REPL中,只需输入
items 进入命令提示符,查看Korma将为您提供的输出。不应显示任何其他字段。如果您在REPL中运行(选择项),它将显示所有内容,无论您是否希望这样做。要获得真实的输出,您可能需要在浏览器窗口或其他地方执行(格式化"%s“项)。
如果所有这些都不起作用,那么使用normal (select db (field :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))https://stackoverflow.com/questions/13070932
复制相似问题