Diesel是Rust中很流行的数据库ORM框架。而由于在MySQL中,时间的默认值以一种与Rust不兼容的方式存储,可能会导致在使用Diesel获取时间类型时,可能由于序列化转换失败而导致数据获取失败。经过查找多个资料,终于找到了一种可以自己定义时间类型处理的方式。
在MySQL数据库中,时间类型的默认值(或者说是记录的“错误值”)是以一个“全零”的时间进行表示的,如下图所示。
而在Rust中,无论diesel的Timestamp实现还是chrono的NaiveDateTime的实现,其实都是不可能存在这种格式的时间的,那么使用MySQL中的时间类型转换为Rust中的时间类型时,就会出现以下错误:
显然,Rust将时间这个类型做的更“安全”了,强制将特殊的时间格式与无效的时间区别开,所以我就想将MySQL数据库中的Timestamp字段以Option
主要的思路是创建一个自定义的数据库类型,然后实现diesel中的序列化相关函数,手动对时间类型进行错误处理。以下是示例代码。
然后,使用自己创建的MysqlTimestampWrap类型,代替原来的NaiveDateTime类型,即可创建一个MySQL数据库到此类型的对应关系。