1

私はコルマで次のことをしようとしましたが、役に立ちませんでした:

SQL:

PREPARE q (int) AS SELECT * FROM post a
    WHERE EXISTS 
        (SELECT parent_id
         FROM post_map 
         WHERE parent_id=a.id AND parent_id=$1);
EXECUTE q(1);

私の最高のコルマの試み:

(defn children [parent-id]        ;; clojure
      (if (number? parent-id)
        (exec-raw (str
          "PREPARE q (int) AS SELECT * FROM post a WHERE EXISTS 
               (SELECT parent_id FROM post_map WHERE parent_id=a.id AND parent_id=$1); 
           EXECUTE q(" parent-id ")") 
         :results)))

そして、これは私が取得し続けるエラーです:(私は 以下の演算子を本当に理解していません:)::

Failure to execute query with SQL:
PREPARE q (int) AS SELECT * FROM post a WHERE EXISTS 
          (SELECT parent_id FROM post_map WHERE parent_id=a.id AND parent_id=$1); 
       EXECUTE q(1)  ::  nil
PSQLException:
 Message: No results were returned by the query.
 SQLState: 02000
 Error Code: 0
PSQLException No results were returned by the query.  org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery (AbstractJdbc2Statement.java:274)

これは、クエリでやりたいことがひどく異様なことだとは思わないので、Korma が私のプロジェクトでうまくいかないのではないかと思っています。私はそれを間違っているだけですか?

更新:これは私がやったことです (私が Korma を救済した後 [申し訳ありませんが Korma])。

(defn children [parent-id]
  (if (unsigned? parent-id)
    (sql/with-connection db
      (sql/with-query-results results
         [(str "select " field-list ", b.parent_id from post a, post_map b where a.id=b.child_id and a.id in "
               "(select child_id from post c, post_map d where c.id=d.parent_id and c.id=?)") parent-id]
           (into [] results)))))
4

1 に答える 1

2

Korma は内部で do-prepared を使用します。これは単一のステートメントに対してのみ機能し、それを準備します。

これは機能します:

;; but isn't it more 'parent' than 'children'?
(defn children-raw [parent-id]
  (if (number? parent-id)
    (exec-raw [(str
                "SELECT * FROM post a WHERE EXISTS
               (SELECT parent_id FROM post_map WHERE parent_id=a.id AND parent_id=?)")
               [parent-id]]
              :results)))

ただし、この小さな例からはわかりにくい場合でも、命名/スキーマに少し混乱しています。あなたの関数は「childREN」と呼ばれていますが、 EXISTS() を使用すると、最大で単一のレコードが返されると思います。また、を選択しているようですが、暗黙の結合では常に自分自身を選択しますか?

post_map が id から parent_id へのリンクであり、子を取得したい場合は、次のように考えます。

(defentity post
  (entity-fields :id))
(defentity post_map
  (entity-fields :id :parent_id))
(defn children-dsl [parent-id]
  (if (number? parent-id)
    (select post
            (where {:id [in (subselect post_map
                                       (fields :id)
                                       (where {:parent_id parent-id}))]}))))
于 2013-03-09T17:51:08.777 に答える