4

假设你已经做了一个 defdb。我有一个表“items”,它有两个字段,“id”(PK)和“item”。我想设置一个实体,以便每当我选择它时,我只能获得“项目”中的条目。从我认为是这样做的方法的文档来看。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做我想做的事?

4

3 回答 3

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#)))
于 2012-10-25T17:57:52.263 回答
0

id是 Korma 中的默认 PK 列名称。这就是您在结果列表中看到它的原因。您可以使用transform定义将其删除:

(korma/defentity items
  (korma/entity-fields :item)
  (korma/transform #(dissoc % :id)))
于 2012-10-25T17:22:50.307 回答
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])) 子句就没有什么可耻的了。你会发现无论如何你都将被迫解构以使用这些信息。

编辑:::::::

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

你不应该这样做

(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,您需要解构上面的 hash-map。我将把它作为练习留给你学习,因为解构很重要而且很难学习,除非你自己动手,但我会给你一个开始的小地方,它不会给你答案,但不会也不抛出错误:

(let [{myAlias :fields} myQuery]
    (format "%s" myAlias))
于 2012-10-31T05:30:11.630 回答