From 3c0d0fbad9ac2a7741bd621d4459dcff1f6bd1ea Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Thu, 14 May 2026 11:34:27 +0800 Subject: [PATCH] fix(postgres): sync client timezone on connect Set PostgreSQL session timezone to the client's local timezone via after_connect, matching Navicat's behavior. (closes #262) --- crates/dbx-core/Cargo.toml | 1 + crates/dbx-core/src/db/postgres.rs | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/dbx-core/Cargo.toml b/crates/dbx-core/Cargo.toml index c1e6fd8f4e..73b594ae2c 100644 --- a/crates/dbx-core/Cargo.toml +++ b/crates/dbx-core/Cargo.toml @@ -25,6 +25,7 @@ duckdb = "1.3.2" tiberius = { version = "0.12.3", default-features = false, features = ["tds73", "chrono", "rust_decimal", "rustls"] } reqwest = { version = "0.12", default-features = false, features = ["json", "stream", "rustls-tls", "socks"] } futures = "0.3" +iana-time-zone = "0.1" mongodb = "3.2.5" russh = "0.60" portpicker = "0.1.1" diff --git a/crates/dbx-core/src/db/postgres.rs b/crates/dbx-core/src/db/postgres.rs index bec71c4fda..0a68a21016 100644 --- a/crates/dbx-core/src/db/postgres.rs +++ b/crates/dbx-core/src/db/postgres.rs @@ -133,12 +133,21 @@ pub async fn connect(url: &str) -> Result { // Validate SSL certificate paths if present in the URL validate_postgres_ssl_paths(url)?; + let tz = iana_time_zone::get_timezone().unwrap_or_else(|_| "UTC".to_string()); + let url_owned = url.to_string(); super::with_connection_timeout("PostgreSQL", async { PgPoolOptions::new() .max_connections(5) .acquire_timeout(super::connection_timeout()) .idle_timeout(Duration::from_secs(300)) - .connect(url) + .after_connect(move |conn, _meta| { + let tz = tz.clone(); + Box::pin(async move { + conn.execute(sqlx::query(&format!("SET timezone = '{tz}'"))).await?; + Ok(()) + }) + }) + .connect(&url_owned) .await .map_err(|e| format!("PostgreSQL connection failed: {e}")) })