From 9413df686e7d34425a6a1bbc0f0798fc5576732e Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Mon, 11 May 2026 11:00:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(grid):=20Enter=20=E9=94=AE=E4=BC=98?= =?UTF-8?q?=E5=85=88=E9=80=89=E4=B8=AD=E8=87=AA=E5=8A=A8=E8=A1=A5=E5=85=A8?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=E9=A1=B9=20(closes=20#202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WHERE 和 ORDER BY 输入框中,有自动补全建议显示时按 Enter 键 现在会选中当前高亮的建议项,而不是直接执行查询。 --- crates/dbx-core/src/db/dm_driver.rs | 9 +++++++++ crates/dbx-core/src/db/oracle_driver.rs | 9 +++++++++ crates/dbx-core/src/query.rs | 16 ++++++++++++++-- src/components/grid/DataGrid.vue | 8 ++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/crates/dbx-core/src/db/dm_driver.rs b/crates/dbx-core/src/db/dm_driver.rs index 8df20fd92..a3cd8b5ea 100644 --- a/crates/dbx-core/src/db/dm_driver.rs +++ b/crates/dbx-core/src/db/dm_driver.rs @@ -258,6 +258,15 @@ pub fn list_triggers(client: &DmClient, schema: &str, table: &str) -> Result Result { + let set_schema = format!("SET SCHEMA \"{}\"", schema); + client.conn.execute(&set_schema, (), None).map_err(|e| { + log::error!("[dameng] set schema failed: {e}"); + e.to_string() + })?; + execute_query_sync(client, sql) +} + pub fn execute_query_sync(client: &DmClient, sql: &str) -> Result { let start = Instant::now(); let sql = sql.trim().trim_end_matches(';'); diff --git a/crates/dbx-core/src/db/oracle_driver.rs b/crates/dbx-core/src/db/oracle_driver.rs index 70dc0d0ea..1ff2021da 100644 --- a/crates/dbx-core/src/db/oracle_driver.rs +++ b/crates/dbx-core/src/db/oracle_driver.rs @@ -330,6 +330,15 @@ pub async fn list_triggers(conn: &OracleClient, schema: &str, table: &str) -> Re .collect()) } +pub async fn execute_query_with_schema(conn: &OracleClient, schema: &str, sql: &str) -> Result { + let set_schema = format!("ALTER SESSION SET CURRENT_SCHEMA = \"{}\"", schema); + conn.execute(&set_schema, &[]).await.map_err(|e| { + log::error!("[oracle] set current_schema failed: {e}"); + e.to_string() + })?; + execute_query(conn, sql).await +} + pub async fn execute_query(conn: &OracleClient, sql: &str) -> Result { let start = Instant::now(); let sql = sql.trim().trim_end_matches(';'); diff --git a/crates/dbx-core/src/query.rs b/crates/dbx-core/src/query.rs index e21d71ca6..096afe95b 100644 --- a/crates/dbx-core/src/query.rs +++ b/crates/dbx-core/src/query.rs @@ -191,6 +191,7 @@ pub async fn do_execute( } PoolKind::Oracle(pool) => { let client = pool.client(); + let schema = schema.map(|s| s.to_string()); drop(connections); let client = match cancel_token.as_ref() { Some(token) => tokio::select! { @@ -200,7 +201,13 @@ pub async fn do_execute( }, None => client.lock().await, }; - wait_for_query(cancel_token, db::oracle_driver::execute_query(&*client, sql)).await.map(truncate_result) + if let Some(schema) = schema { + wait_for_query(cancel_token, db::oracle_driver::execute_query_with_schema(&*client, &schema, sql)) + .await + .map(truncate_result) + } else { + wait_for_query(cancel_token, db::oracle_driver::execute_query(&*client, sql)).await.map(truncate_result) + } } PoolKind::Elasticsearch(client) => { let client = client.clone(); @@ -215,11 +222,16 @@ pub async fn do_execute( PoolKind::Dameng(client) => { let client = client.clone(); let sql = sql.to_string(); + let schema = schema.map(|s| s.to_string()); drop(connections); wait_for_query(cancel_token, async move { let task = tokio::task::spawn_blocking(move || { let client = client.lock().map_err(|e| e.to_string())?; - db::dm_driver::execute_query_sync(&client, &sql) + if let Some(schema) = schema { + db::dm_driver::execute_query_with_schema_sync(&client, &schema, &sql) + } else { + db::dm_driver::execute_query_sync(&client, &sql) + } }); task.await.map_err(|e| e.to_string())? }) diff --git a/src/components/grid/DataGrid.vue b/src/components/grid/DataGrid.vue index 258594071..09dbb66cd 100644 --- a/src/components/grid/DataGrid.vue +++ b/src/components/grid/DataGrid.vue @@ -623,6 +623,10 @@ function onWhereFilterKeydown(e: KeyboardEvent) { } if (e.key === "Enter") { e.preventDefault(); + if (whereSuggestions.value.length > 0) { + acceptWhereSuggestion(); + return; + } applyWhereFilter(); } } @@ -709,6 +713,10 @@ function onOrderByKeydown(e: KeyboardEvent) { } if (e.key === "Enter") { e.preventDefault(); + if (orderBySuggestions.value.length > 0) { + acceptOrderBySuggestion(); + return; + } applyOrderBySearch(); } }