如何使用 clojure.java.jdbc 插入包含时间戳值的行?

Posted

技术标签:

【中文标题】如何使用 clojure.java.jdbc 插入包含时间戳值的行?【英文标题】:How do I insert rows containing Timestamp values, using clojure.java.jdbc? 【发布时间】:2011-07-23 05:58:31 【问题描述】:

我正在尝试使用 clojure.java.jdbc 将行插入数据库。 (有问题的数据库是 sqlite)。

我可以这样创建一个表:

(def db :classname "org.sqlite.JDBC"
         :subprotocol "sqlite"
         :subname "/path/to/my/database")

(with-connection db (create-table :foo [:bar :int] 
                                       [:baz :int] 
                                       [:timestamp :datetime]))

这很有效。但是,如果我尝试在数据库中插入一行,则会失败:

(with-connection db (insert-rows :foo
          [1 2 (java.sql.Timestamp. (.getTime (java.util.Date.)))]))

给出异常:断言失败:参数计数 (3) != 值计数 (6)。

但如果我在表定义和插入行操作中省略了时间戳字段,则没有问题。那么我在时间戳方面做错了什么?

【问题讨论】:

【参考方案1】:
 (def sqllite-settings
  
   :classname   "org.sqlite.JDBC"
   :subprotocol "sqlite"
   :subname     "test.db"
  
 )

(with-connection sqllite-settings 
  (create-table :foo 
        [:bar :int] 
        [:baz :int]  
        [:timestamp :datetime]))

(with-connection sqllite-settings (insert-rows :foo
       [1 2 (java.sql.Timestamp. (.getTime (java.util.Date.)))]))

(with-connection sqllite-settings 
       (with-query-results rs ["select * from foo"] (doall rs)))

返回预期:

(:bar 1, :baz 2, :timestamp 1311565709390)

我正在使用 clojure.contrib.sql

(use 'clojure.contrib.sql)

还有来自这里的 SQLLite 驱动程序:http://www.zentus.com/sqlitejdbc/

如果 contrib.sql 适合你,你能试试吗?

【讨论】:

以上是关于如何使用 clojure.java.jdbc 插入包含时间戳值的行?的主要内容,如果未能解决你的问题,请参考以下文章

java.jdbc clojure 执行!插入数量

如何做批处理 jdbc/insert!和 jdbc/更新!在 Clojure 中使用 postgresql?

使用clojure.java.jdbc在Clojure中使用外键约束

clojure.java.jdbc 更新 id 在哪里

Clojure jdbc 创建复合主键

clojure.java.jdbc /查询大结果集懒惰