我是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"})
但是之后如果我转到数据库中的.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
这是正常的吗?
答案 0 :(得分: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))))
正如你所看到的,除了应该更新之外,绝对没有办法产生任何东西。那么实际发生了什么?
由于HyperSQL在.log文件中记录DDL和DML语句,因此该文件可用于检查发送到数据库的内容。 请注意,UPDATE语句由DELETE后跟INSERT语句表示。
因此HSQLDB日志只是编写DELETE和INSERT,即使正在执行的查询实际上是UPDATE。