2

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

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)

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

user=> (select posts (fields :id :title :content :status :created : published )) 使用 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)

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

user=> (select posts (fields :id :title :content :status :created :author)) [{:id 1, :title "Hello World!", :content "欢迎使用世界上最先进的 Clojure Beat 引擎 Beats ! ", :status true, :created #, :author 1} {:id 2, :title "Hello World!, again!", :content "Sayin 't 'gain!欢迎来到 Beats,世界上最先进的 Clojure Beat引擎! ", :status true, :created #, :author 2}]

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

4

1 回答 1

2

假设 Marc B 是正确的,并且问题的原因是您有一条发布为 0000-00-00 的记录,那么您可以将 zeroDateTimeBehavior=convertToNull 添加到您的 Korma mysql :db 键,例如:

:db "mydb?zeroDateTimeBehavior=convertToNull"

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

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

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

也可以看看:

于 2013-04-05T17:46:30.330 回答