使用Korma和MySQL投射空日期字段

时间:2012-12-12 20:41:34

标签: clojure korma

使用Korma和MySQL我试图从名为posts的表中进行选择,默认情况下,发布日期的字段为零。

mysql> describe posts;
+-----------+--------------+------+-----+---------------------+-------+
| Field     | Type         | Null | Key | Default             | Extra |
+-----------+--------------+------+-----+---------------------+-------+
| id        | int(11)      | NO   | PRI | 0                   |       |
| title     | varchar(250) | YES  |     | NULL                |       |
| content   | text         | YES  |     | NULL                |       |
| status    | tinyint(1)   | YES  |     | 0                   |       |
| created   | timestamp    | NO   |     | CURRENT_TIMESTAMP   |       |
| published | timestamp    | NO   |     | 0000-00-00 00:00:00 |       |
| author    | int(11)      | NO   | MUL | NULL                |       |
+-----------+--------------+------+-----+---------------------+-------+
7 rows in set (0.02 sec)

如果我尝试选择并使用已发布的字段,我会收到以下错误:

  

用户=> (选择帖子(字段:id:title:content:status:created   :已发布))无法使用SQL执行查询:SELECT posts.id,   posts.title,posts.content,posts.status,posts.created,   posts.published FROM posts :: [] ClassCastException   java.lang.RuntimeException无法强制转换为java.sql.SQLException   clojure.java.jdbc / print-sql-exception(jdbc.clj:350)

如果我不使用已发布的字段,一切正常:

  

用户=> (选择帖子(字段:id:title:content:status:created   :作者))[{:id 1,:title“Hello World!”,:content“欢迎来到   Beats,世界上最先进的Clojure Beat Engine!“,:状态   true ,: created#,:author 1} {:id 2,   :标题“Hello World!,再次!”,:内容“Sayin't'获得!欢迎   to Beats,世界上最先进的Clojure Beat Engine!“,   :status true,:created#,:author 2}]

我该如何处理这个字段?我试图通过一个简单的日志语句向我的实体添加一个转换函数,但它似乎甚至没有被调用。

1 个答案:

答案 0 :(得分:2)

假设Marc B是正确的,问题的原因是你有一个发布的例子,那么你可以将zeroDateTimeBehavior = convertToNull添加到你的Korma mysql:db key,例如:

:db "mydb?zeroDateTimeBehavior=convertToNull"

现在,JDBC和Korma将为该记录返回已发布的nil:

(select posts (fields :id :published))
;; [{:published nil, :id 1}]

您可能必须重新启动repl才能使该标志生效。

另见: