使用Rocket和Diesel无法从已填充MySQL数据库获取datetime的问题
解决Rocket + Diesel从MySQL检索DateTime类型数据的问题
我来帮你梳理下遇到的这个DateTime类型映射问题的常见解决思路:
1. 先确认依赖配置是否正确
首先检查你的Cargo.toml,必须启用Diesel对chrono和MySQL的支持,不然类型映射会失效:
[dependencies] diesel = { version = "2.0", features = ["mysql", "chrono", "serde_json"] } chrono = { version = "0.4", features = ["serde", "utc"] } rocket = { version = "0.5", features = ["json"] } serde = { version = "1.0", features = ["derive"] }
重点是Diesel的chrono特性,它是实现Diesel SQL类型和chrono Rust类型互相转换的核心。
2. 修正模型中的类型匹配
从你给出的代码片段来看,大概率是模型字段的Rust类型和数据库字段的SQL类型不匹配:
- MySQL的
DATETIME字段,对应Diesel的SQL类型是diesel::sql_types::Datetime,映射到Rust里应该用chrono::NaiveDateTime(如果数据库时间不带时区);如果是MySQL的TIMESTAMP(带时区),则用chrono::DateTime<Utc>。 - 不需要手动给字段加
#[diesel(sql_type = Datetime)],Queryable宏会自动和schema文件的定义匹配。
修正后的模型示例(补全你没写完的部分):
extern crate chrono; use diesel::prelude::*; use diesel::mysql::MysqlConnection; use schema::chrisms; use chrono::{NaiveDateTime, DateTime, Utc}; use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize, Queryable)] pub struct Chrisms { pub entity_ekklesia_location_id: i32, pub serie_number: Option<String>, pub seat_number: Option<String>, // 假设数据库字段是不带时区的DATETIME pub created_at: NaiveDateTime, // 如果是带时区的TIMESTAMP,就用这个类型 // pub updated_at: DateTime<Utc>, }
3. 检查自动生成的Schema文件
Diesel自动生成的src/schema.rs里,你的chrisms表字段应该是这样的(确保datetime字段的类型是Datetime):
table! { chrisms { entity_ekklesia_location_id -> Int4, serie_number -> Nullable(Varchar), seat_number -> Nullable(Varchar), created_at -> Datetime, } }
如果是手动写的schema,一定要确认Datetime是从diesel::sql_types导入的,且和数据库字段类型完全对应。
4. 查询时的类型验证
执行查询的时候,Diesel会自动完成类型转换,比如这样的基础查询:
pub fn fetch_all_chrisms(conn: &mut MysqlConnection) -> QueryResult<Vec<Chrisms>> { chrisms::table.load::<Chrisms>(conn) }
如果出现编译错误,优先检查:模型的Rust类型和schema里的SQL类型是否一一对应?比如不要把NaiveDateTime和DateTime<Utc>搞混,或者 nullable 字段有没有加Option包裹。
几个容易踩的坑
- 如果数据库的datetime字段允许为空,模型里必须用
Option<NaiveDateTime>或者Option<DateTime<Utc>>; - 尽量让数据库时区和应用程序时区保持一致,避免出现时间偏移的问题;
- 不要随便自定义类型映射,除非你明确知道自己在做什么,默认的chrono支持足够覆盖大部分场景。
内容的提问来源于stack exchange,提问作者Leonel Sá
相关产品推荐
相关产品推荐

