From 9e58fefab81a190bb48313bfe972e0544dbbf8b9 Mon Sep 17 00:00:00 2001 From: Yikuanzz <90631539+Yikuanzz@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:40:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(mysql):=20=E6=9F=A5=E8=AF=A2=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E4=B8=AD=E6=AD=A3=E7=A1=AE=E5=BA=8F=E5=88=97=E5=8C=96?= =?UTF-8?q?=20DATETIME=20=E7=AD=89=E6=97=B6=E9=97=B4=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E6=98=BE=E7=A4=BA=E4=B8=BA=20null?= =?UTF-8?q?=20(#20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/db/mysql.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src-tauri/src/db/mysql.rs b/src-tauri/src/db/mysql.rs index 8691046632..bf1eeb7a00 100644 --- a/src-tauri/src/db/mysql.rs +++ b/src-tauri/src/db/mysql.rs @@ -1,3 +1,4 @@ +use chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime, Utc}; use sqlx::mysql::{MySqlPool, MySqlPoolOptions, MySqlRow}; use sqlx::{Column, Executor, Row, TypeInfo, ValueRef}; use std::time::{Duration, Instant}; @@ -28,6 +29,22 @@ fn get_opt_str(row: &MySqlRow, name: &str) -> Option { }) } +fn mysql_temporal_to_json_value(row: &MySqlRow, idx: usize) -> Option { + if let Ok(v) = row.try_get::(idx) { + return Some(serde_json::Value::String(v.to_string())); + } + if let Ok(v) = row.try_get::, _>(idx) { + return Some(serde_json::Value::String(v.to_rfc3339())); + } + if let Ok(v) = row.try_get::(idx) { + return Some(serde_json::Value::String(v.to_string())); + } + if let Ok(v) = row.try_get::(idx) { + return Some(serde_json::Value::String(v.to_string())); + } + None +} + fn mysql_value_to_json(row: &MySqlRow, idx: usize, type_name: &str) -> serde_json::Value { if row.try_get_raw(idx).map(|v| v.is_null()).unwrap_or(true) { return serde_json::Value::Null; @@ -60,6 +77,17 @@ fn mysql_value_to_json(row: &MySqlRow, idx: usize, type_name: &str) -> serde_jso .unwrap_or(serde_json::Value::Null); } + if upper_type.starts_with("DATETIME") + || upper_type.starts_with("TIMESTAMP") + || upper_type == "DATE" + || upper_type == "TIME" + || upper_type.starts_with("TIME(") + { + if let Some(v) = mysql_temporal_to_json_value(row, idx) { + return v; + } + } + row.try_get::(idx) .map(serde_json::Value::String) .or_else(|_| row.try_get::(idx).map(|v| serde_json::Value::Number(v.into()))) @@ -74,6 +102,7 @@ fn mysql_value_to_json(row: &MySqlRow, idx: usize, type_name: &str) -> serde_jso row.try_get::, _>(idx) .map(|b| serde_json::Value::String(String::from_utf8_lossy(&b).to_string())) }) + .or_else(|e| mysql_temporal_to_json_value(row, idx).ok_or(e)) .unwrap_or(serde_json::Value::Null) }