|
|
@@ -91,110 +91,88 @@ impl Database { |
|
|
|
|
|
|
|
pub fn format_row_as_json(row: &Row, table_name: &str) -> serde_json::Value { |
|
|
|
let mut map = serde_json::Map::new(); |
|
|
|
|
|
|
|
// 添加 table_name 字段 |
|
|
|
map.insert("table_name".to_string(), serde_json::Value::String(table_name.to_string())); |
|
|
|
|
|
|
|
for (i, column) in row.columns().iter().enumerate() { |
|
|
|
let name = column.name(); |
|
|
|
let type_name = column.type_().name(); |
|
|
|
println!("字段 {} 的类型是: {}", name, type_name); |
|
|
|
// println!("字段 {} 的类型是: {}", name, type_name); |
|
|
|
|
|
|
|
let value = match type_name { |
|
|
|
"int2" | "int4" | "int8" => { |
|
|
|
match row.try_get::<_, Option<i64>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
println!("成功读取整数: {} = {}", name, val); |
|
|
|
serde_json::Value::Number(serde_json::Number::from(val)) |
|
|
|
}, |
|
|
|
Ok(None) => { |
|
|
|
println!("字段 {} 为 null", name); |
|
|
|
serde_json::Value::Null |
|
|
|
}, |
|
|
|
Err(e) => { |
|
|
|
println!("读取整数失败 {}: {}", name, e); |
|
|
|
// 尝试其他整数类型 |
|
|
|
match row.try_get::<_, Option<i32>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
println!("成功读取 i32: {} = {}", name, val); |
|
|
|
serde_json::Value::Number(serde_json::Number::from(val)) |
|
|
|
}, |
|
|
|
Ok(None) => { |
|
|
|
println!("字段 {} 为 null", name); |
|
|
|
serde_json::Value::Null |
|
|
|
}, |
|
|
|
Err(_) => { |
|
|
|
match row.try_get::<_, Option<i16>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
println!("成功读取 i16: {} = {}", name, val); |
|
|
|
serde_json::Value::Number(serde_json::Number::from(val)) |
|
|
|
}, |
|
|
|
Ok(None) => { |
|
|
|
println!("字段 {} 为 null", name); |
|
|
|
serde_json::Value::Null |
|
|
|
}, |
|
|
|
Err(_) => serde_json::Value::Null |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
"int2" => match row.try_get::<_, Option<i16>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
// println!("成功读取 int2: {} = {}", name, val); |
|
|
|
serde_json::Value::Number(serde_json::Number::from(val)) |
|
|
|
}, |
|
|
|
_ => serde_json::Value::Null |
|
|
|
}, |
|
|
|
"numeric" | "float4" | "float8" => { |
|
|
|
match row.try_get::<_, Option<f64>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
println!("成功读取浮点数: {} = {}", name, val); |
|
|
|
match serde_json::Number::from_f64(val) { |
|
|
|
Some(n) => serde_json::Value::Number(n), |
|
|
|
None => serde_json::Value::Null |
|
|
|
} |
|
|
|
}, |
|
|
|
Ok(None) => { |
|
|
|
println!("字段 {} 为 null", name); |
|
|
|
serde_json::Value::Null |
|
|
|
}, |
|
|
|
Err(e) => { |
|
|
|
println!("读取浮点数失败 {}: {}", name, e); |
|
|
|
serde_json::Value::Null |
|
|
|
"int4" => match row.try_get::<_, Option<i32>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
// println!("成功读取 int4: {} = {}", name, val); |
|
|
|
serde_json::Value::Number(serde_json::Number::from(val)) |
|
|
|
}, |
|
|
|
_ => serde_json::Value::Null |
|
|
|
}, |
|
|
|
"int8" => match row.try_get::<_, Option<i64>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
// println!("成功读取 int8: {} = {}", name, val); |
|
|
|
serde_json::Value::Number(serde_json::Number::from(val)) |
|
|
|
}, |
|
|
|
_ => serde_json::Value::Null |
|
|
|
}, |
|
|
|
"numeric" => match row.try_get::<_, Option<f64>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
// println!("成功读取 numeric: {} = {}", name, val); |
|
|
|
match serde_json::Number::from_f64(val) { |
|
|
|
Some(n) => serde_json::Value::Number(n), |
|
|
|
None => serde_json::Value::String(val.to_string()) |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
_ => serde_json::Value::Null |
|
|
|
}, |
|
|
|
"text" | "varchar" => { |
|
|
|
match row.try_get::<_, Option<String>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
println!("成功读取字符串: {} = {}", name, val); |
|
|
|
serde_json::Value::String(val) |
|
|
|
}, |
|
|
|
_ => { |
|
|
|
println!("字段 {} 为 null", name); |
|
|
|
serde_json::Value::Null |
|
|
|
"float4" => match row.try_get::<_, Option<f32>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
// println!("成功读取 float4: {} = {}", name, val); |
|
|
|
match serde_json::Number::from_f64(val as f64) { |
|
|
|
Some(n) => serde_json::Value::Number(n), |
|
|
|
None => serde_json::Value::String(val.to_string()) |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
_ => serde_json::Value::Null |
|
|
|
}, |
|
|
|
"bool" => { |
|
|
|
match row.try_get::<_, Option<bool>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
println!("成功读取布尔值: {} = {}", name, val); |
|
|
|
serde_json::Value::String(if val { "1".to_string() } else { "0".to_string() }) |
|
|
|
}, |
|
|
|
_ => { |
|
|
|
println!("字段 {} 为 null", name); |
|
|
|
serde_json::Value::Null |
|
|
|
"float8" => match row.try_get::<_, Option<f64>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
// println!("成功读取 float8: {} = {}", name, val); |
|
|
|
match serde_json::Number::from_f64(val) { |
|
|
|
Some(n) => serde_json::Value::Number(n), |
|
|
|
None => serde_json::Value::String(val.to_string()) |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
_ => serde_json::Value::Null |
|
|
|
}, |
|
|
|
"text" | "varchar" => match row.try_get::<_, Option<String>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
// println!("成功读取字符串: {} = {}", name, val); |
|
|
|
serde_json::Value::String(val) |
|
|
|
}, |
|
|
|
_ => serde_json::Value::Null |
|
|
|
}, |
|
|
|
"bool" => match row.try_get::<_, Option<bool>>(i) { |
|
|
|
Ok(Some(val)) => { |
|
|
|
// println!("成功读取布尔值: {} = {}", name, val); |
|
|
|
serde_json::Value::String(if val { "1".to_string() } else { "0".to_string() }) |
|
|
|
}, |
|
|
|
_ => serde_json::Value::Null |
|
|
|
}, |
|
|
|
"timestamp" | "timestamptz" | "date" => { |
|
|
|
println!("处理时间字段: {}", name); |
|
|
|
// println!("处理时间字段: {}", name); |
|
|
|
match row.try_get::<_, Option<NaiveDateTime>>(i) { |
|
|
|
Ok(Some(dt)) => { |
|
|
|
let formatted = dt.format("%Y-%m-%d %H:%M:%S").to_string(); |
|
|
|
println!("成功读取本地时间: {} = {}", name, formatted); |
|
|
|
// println!("成功读取本地时间: {} = {}", name, formatted); |
|
|
|
serde_json::Value::String(formatted) |
|
|
|
}, |
|
|
|
_ => { |
|
|
|
println!("字段 {} 为 null", name); |
|
|
|
serde_json::Value::Null |
|
|
|
} |
|
|
|
_ => serde_json::Value::Null |
|
|
|
} |
|
|
|
}, |
|
|
|
_ => { |
|
|
|