首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在korma中选择默认字段?

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

Stack Overflow用户
提问于 2012-10-25 22:33:59
回答 3查看 1K关注 0票数 4

假设您已经创建了defdb。我有一个表"items“,它有两个字段,"id”(PK)和"item“。我想设置一个实体,这样每当我选择它时,我只会得到"item“中的条目。根据documentation的判断,我认为korma/entity-fields是实现这一点的方法。

代码语言:javascript
复制
(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做我想做的事呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-26 01:57:52

我不认为在defentity中可以做到这一点-- select的工作方式只有select *,而不显式地传递字段列表。

基于korma/select的帮助器宏如何:

代码语言:javascript
复制
(defmacro select-without-id
  [ent & body]
  `(let [query# (-> (korma/select* ~ent)
                (korma/fields (vec (:fields ~ent)))
                 ~@body)]
     (korma/exec query#)))
票数 1
EN

Stack Overflow用户

发布于 2012-10-26 01:22:50

id是Korma中默认的主键列名。这就是为什么你会在结果列表中看到它。您可以使用transform definition删除它:

代码语言:javascript
复制
(korma/defentity items
  (korma/entity-fields :item)
  (korma/transform #(dissoc % :id)))
票数 0
EN

Stack Overflow用户

发布于 2012-10-31 13:30:12

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

代码语言:javascript
复制
(ns yourproject.path.kormastuff
    (:use [korma.core]
          [korma.db]))

然后按如下方式创建实体:

代码语言:javascript
复制
(defentity items
  (entity-fields :item))

我认为您可能遇到了困难,因为您正在尝试为核心添加别名,而您错过了db。最好是将这些东西放到它自己的文件中,然后调用你想要的查询,如果你愿意,可以使用别名,从其他名称空间中调用,例如:

代码语言:javascript
复制
(ns project.core
    (:use [project.path.kormastuff :as kormadb]))

然后:

代码语言:javascript
复制
(select kormadb/items)

来得到你的结果。这应该行得通。

在REPL中,只需输入

代码语言:javascript
复制
items 

进入命令提示符,查看Korma将为您提供的输出。不应显示任何其他字段。如果您在REPL中运行(选择项),它将显示所有内容,无论您是否希望这样做。要获得真实的输出,您可能需要在浏览器窗口或其他地方执行(格式化"%s“项)。

如果所有这些都不起作用,那么使用normal (select db (field :item))子句也没什么可耻的。不管怎样,你会发现为了使用这些信息,你将不得不进行分解。

编辑:

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

你不应该这么做

代码语言:javascript
复制
(select kormadb/items) 

得到你想要的东西。您只需要调用实体本身,因此您只需要调用REPL中的项,而不是REPL中的(选择项)。

您可能想要这样做

代码语言:javascript
复制
(def myQuery kormadb/items)

$ myQuery

您将看到默认情况下没有选择其他字段。

你也可以这样做

代码语言:javascript
复制
(let [myQuery kormadb/items] 
    (format "%s" myQuery))

我在这里修改,但我得到的结果类似于:

代码语言:javascript
复制
{:table "items", :name "items", :pk :id, :db nil, :transforms (), :prepare
s (), :fields ("\"items\".\"item\""), :rel {}}

为了使用myQuery,您需要对上面的散列映射进行解构。我将把它作为练习留给你去学习,因为除非你自己动手,否则解构是很重要且很难学习的,但我会给你一个小的起点,它不会给你一个答案,但也不会抛出错误:

代码语言:javascript
复制
(let [{myAlias :fields} myQuery]
    (format "%s" myAlias))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13070932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档