Diesel中处理MySQL中的无效时间戳 - sbw Blog

Diesel中处理MySQL中的无效时间戳

来源: sbw Blog | 浏览: 6 | 评论: 0 发表时间: 2024-03-10

Diesel是Rust中很流行的数据库ORM框架。而由于在MySQL中,时间的默认值以一种与Rust不兼容的方式存储,可能会导致在使用Diesel获取时间类型时,可能由于序列化转换失败而导致数据获取失败。经过查找多个资料,终于找到了一种可以自己定义时间类型处理的方式。



MySQL数据库中,时间类型的默认值(或者说是记录的“错误值”)是以一个“全零”的时间进行表示的,如下图所示。

mysql-all-zero-timestamp

而在Rust中,无论dieselTimestamp实现还是chronoNaiveDateTime的实现,其实都是不可能存在这种格式的时间的,那么使用MySQL中的时间类型转换为Rust中的时间类型时,就会出现以下错误:

diesel-parse-error-deserialization-date

显然,Rust将时间这个类型做的更“安全”了,强制将特殊的时间格式与无效的时间区别开,所以我就想将MySQL数据库中的Timestamp字段以Option这种方式进行映射,从而安全的区分出MySQL中的有效时间与无效时间。


主要的思路是创建一个自定义的数据库类型,然后实现diesel中的序列化相关函数,手动对时间类型进行错误处理。以下是示例代码。


然后,使用自己创建的MysqlTimestampWrap类型,代替原来的NaiveDateTime类型,即可创建一个MySQL数据库到此类型的对应关系。

rust-diesel-custom-field-database-type


没有人评论过此文,还不快抢个沙发
  • 昵称: *
  • 邮箱:
  • 网址:
  • 记住我的信息
  • Color
  • Red
  • Blue
  • Code
  • bash
  • cpp
  • css
  • java
  • js
  • perl
  • php
  • python
  • ruby
  • sql
  • xml