Rust 使用sqlx连接mysql的时区问题

寻龙剑侠 2025-04-26 11:09:16 105 阅读 Rust

文章讲述了在Rust中使用sqlx库操作Mysql数据库时遇到的时间显示为UTC时区的问题。原因是sqlx在建立连接时默认设置了时区为UTC。使用MySqlConnectOptions::new()..timezone("+8:00".to_string());来解决问题

前言

本博客是采用Rust编写的后台,使用sqlx插件连接mysql数据库,但是在涉及时间保存的时候,总是默认是格林兰时区,而不是北京时区。即使已经调整了mysql的时区,仍然无法解决。因此判断是sqlx的问题导致,查阅网上的资料发现确实如此


一、原因

sqlx的底层连接数据库时,默认采用了UTC时区,因此总是相差8个小时。

二、解决办法

方法一:after_connect

使用after_connect执行 "SET time_zone='+08:00';" ,如下,但是我的不行,应该是sqlx的版本不同。我的sqlx:0.8.3 会提示没有after_connect方法


let pool = match MySqlPoolOptions::new()
           .after_connect(|conn, _meta| Box::pin(async move {
             conn.execute("SET time_zone='+08:00';").await?;
              Ok(())
           }))
          .connect(&db_url).await {
             Ok(value) => value,
                  Err(_)=>{
                    panic!("数据库连接失败,请检查网络或数据库设置");
                  }
        };

方法二:MySqlConnectOptions::new()

使用MySqlConnectOptions::new() 配置

let options = MySqlConnectOptions::new()
    .host("localhost")
    .username("username")
    .password("password")
    .database("database")
    .timezone("+8:00".to_string());
    
    let pool = MySqlPool::connect_with(options)
        .await
        .expect("创建连接池失败");

参考:

标签: rust sqlx

评论

评论先审后显;邮箱仅用于生成头像(MD5),不会公开显示