From 36168f26d77934ae695f32229e71f5453d4c9bfa Mon Sep 17 00:00:00 2001 From: xfy Date: Tue, 30 Jun 2026 13:51:48 +0800 Subject: [PATCH] fix(database): cast extract(epoch)::double precision in active-connections query MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 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. 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 (chrono feature enabled), schema_migrations.version TEXT->String, count(*)::int->i32 (fixed previously). --- src/api/database/status.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/api/database/status.rs b/src/api/database/status.rs index a66a3cd..c7dd521 100644 --- a/src/api/database/status.rs +++ b/src/api/database/status.rs @@ -173,11 +173,13 @@ pub async fn get_db_status() -> Result { }) .collect(); - // 活跃连接(过滤自身 pid,避免循环显示) + // 活跃连接(过滤自身 pid,避免循环显示)。 + // extract(epoch FROM ...) 原生返回 numeric(decimal),tokio-postgres 无 FromSql + // 实现该类型;显式 ::double precision 转 float8 以匹配 query_duration_secs 的 f64。 let conn_rows = client .query( "SELECT pid, usename, state, query, \ - extract(epoch FROM now() - query_start) \ + extract(epoch FROM now() - query_start)::double precision \ FROM pg_stat_activity \ WHERE datname = current_database() AND pid <> pg_backend_pid() \ ORDER BY query_start DESC NULLS LAST LIMIT 50",