使用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)
如果我尝试选择并使用已发布的字段,我会得到以下错误:
user=>(选择帖子(字段:id:title:content:status:created:已发布))使用SQL执行查询失败:SELECT posts.id,posts.title,posts.content,posts.status,posts.created,posts.published FROM posts::[]ClassCastExceptionjava.lang.RuntimeException不能强制转换为java.sql.SQLExceptionclojure.jdbc/print-sql-eception(jdbc.clj:350)
如果我不使用已发布的字段,一切都很好:
user=>(选择帖子(字段:id:title:content:status:created:author))[{:id 1,:title"Hello World!",:content">欢迎来到Beats,世界上最先进的Clojure Beat引擎",:状态true,:created#,:author 1}{:id 2,:title"你好,世界!,又来了!",:content"Sayin't'gain!欢迎Beats,世界上最先进的Clojure Beat引擎",:status true,:created#,:author 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才能使标志生效。
另请参阅:
- http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html
- 在JDBC中处理DATETIME值0000-00-00 00:00:00