0

私はclojureが初めてです。hsqldbを使用してjdbcで遊んでいます。

フィールド「cedula」が主キーであるテーブル「persona」を更新するために、この関数を実行しましたか

(defn update [cedula x]
(sql/with-connection common/database
    (sql/update-values :persona
        ["cedula=?" cedula] x)))

これをREPLで実行しました

(per/update 111 {:cedula 122 :nombre "Raul" :cargo "mm"})

しかしその後、DB の .log ファイルに移動すると、削除と挿入が行われていることがわかります。

/*C15*/SET SCHEMA PUBLIC
CONNECT USER SA
SET AUTOCOMMIT FALSE
DELETE FROM PERSONA WHERE CEDULA=111
INSERT INTO PERSONA VALUES(122,'Raul','mm')
COMMIT
SET AUTOCOMMIT TRUE
DISCONNECT

それは正常ですか?

4

1 に答える 1

2

これはのコードですupdate-values

(defn update-values
  "Updates values on selected rows in a table. where-params is a vector
  containing a string providing the (optionally parameterized) selection
  criteria followed by values for any parameters. record is a map from
  strings or keywords (identifying columns) to updated values."
  [table where-params record]
  (let [[where & params] where-params
        column-strs (map as-identifier (keys record))
        columns (apply str (concat (interpose "=?, " column-strs) "=?"))]
    (do-prepared
      (format "UPDATE %s SET %s WHERE %s"
              (as-identifier table) columns where)
      (concat (vals record) params))))

ご覧のとおり、当然のことながら、UPDATE 以外は生成されません。では、実際に何が起こっているのでしょうか。

HSQLDB ドキュメントから:

HyperSQL は DDL および DML ステートメントを .log ファイルに記録するため、このファイルを使用して、データベースに送信されている内容を確認できます。UPDATE ステートメントは、DELETE の後に INSERT ステートメントが続く形で表されることに注意してください。

そのため、実行中のクエリが実際には UPDATE であるにもかかわらず、HSQLDB ログは単純に DELETE と INSERT を書き込んでいます。

于 2012-10-06T05:05:49.210 に答える