0

假设我有一个名为“someTable”的表,我想删除 column1 = “data1”、column2 = “data2”等的行...

这是我到目前为止的代码。

(let [db-host "asdfgh.abc.roott.net"
  db-port 1234      
  db-name "ABCDE"]

(def db {:classname "oracle.jdbc.driver.OracleDriver" ; must be in classpath
       :subprotocol "oracle:thin"
       :subname (str "@" db-host ":" db-port ":" db-name)
       ; Any additional keys are passed to the driver
       ; as driver-specific properties.
       :user "user"
       :password "password"}
                               ))
(sql/with-connection db
(sql/delete-rows "tableName" [{column1, data1} {column2, data2}]))

我收到一个错误...为什么?

4

2 回答 2

1

delete-rows需要表的名称和 SQLWHERE子句。后者通常作为一个向量给出,该向量由一个参数化的 SQL 字符串(即实际值由 表示的字符串?)和用于所述参数的值组成。

(sql/with-connection db
  (sql/delete-rows "tableName" ["column1 = ? AND column2 = ?" data1 data2]))

当它运行时,?将分别替换为data1data2(顺便说一句,正确转义,这就是为什么首先应该使用它的原因)并且查询对服务器运行。

在您的情况下,您没有提供字符串作为第一个元素,这将导致某种类型ClassCastException或驱动程序尝试执行无效查询。

于 2014-06-23T13:00:05.307 回答
1

clojure.contrib.sql过时,不再维护。您应该clojure.java.jdbc改用 - 请参阅Github 存储库参考文档社区维护的文档

使用更新的库,您不需要with-connection,您可以简单地说:

(sql/delete! db :tableName ["column1 = ? and column2 = ?" data1 data2])
于 2014-06-23T16:45:38.747 回答