fix(database): cast extract(epoch)::double precision in active-connections query
extract(epoch FROM now() - query_start) returns numeric (decimal) in PostgreSQL, but the result was read as f64 via r.get(4). tokio-postgres has no FromSql<f64> impl for the numeric type, so get_db_status panicked at runtime with 'error deserializing column 4' (HTTP 500). Cast to ::double precision (float8) to match query_duration_secs: Option<f64>. Audited the remaining column mappings in status.rs to rule out further type mismatches — all sound: reltuples::bigint->i64, native bigint size columns->i64, last_vacuum/last_analyze timestamptz->DateTime<Utc> (chrono feature enabled), schema_migrations.version TEXT->String, count(*)::int->i32 (fixed previously).
This commit is contained in:
parent
116286f80f
commit
36168f26d7
@ -173,11 +173,13 @@ pub async fn get_db_status() -> Result<DbStatus, ServerFnError> {
|
|||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
// 活跃连接(过滤自身 pid,避免循环显示)
|
// 活跃连接(过滤自身 pid,避免循环显示)。
|
||||||
|
// extract(epoch FROM ...) 原生返回 numeric(decimal),tokio-postgres 无 FromSql<f64>
|
||||||
|
// 实现该类型;显式 ::double precision 转 float8 以匹配 query_duration_secs 的 f64。
|
||||||
let conn_rows = client
|
let conn_rows = client
|
||||||
.query(
|
.query(
|
||||||
"SELECT pid, usename, state, query, \
|
"SELECT pid, usename, state, query, \
|
||||||
extract(epoch FROM now() - query_start) \
|
extract(epoch FROM now() - query_start)::double precision \
|
||||||
FROM pg_stat_activity \
|
FROM pg_stat_activity \
|
||||||
WHERE datname = current_database() AND pid <> pg_backend_pid() \
|
WHERE datname = current_database() AND pid <> pg_backend_pid() \
|
||||||
ORDER BY query_start DESC NULLS LAST LIMIT 50",
|
ORDER BY query_start DESC NULLS LAST LIMIT 50",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user