4

すでにdefdbを実行していると仮定します。「id」(PK)と「item」の2つのフィールドを持つテーブル「items」があります。エンティティを設定して、選択するたびに「アイテム」のエントリのみを取得するようにします。ドキュメントから判断すると、これを行う方法だと思い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"}]

私はコルマ0.3.0-beta7を使用しています。どうすれば自分のkorma/selectやりたいことをやらせることができますか?

4

3 に答える 3

1

defentityフィールドのリストを明示的に渡さずにselectが機能する方法は、これを実行できるとは思いません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コルマのデフォルトの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を使用するには、上記のハッシュマップを分解する必要があります。破壊は重要であり、自分の手を汚さない限り学ぶのは難しいので、それはあなたが学ぶための練習として残しておきますが、答えが得られないが勝った小さな出発点を提供しますエラーもスローしません:

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