From 38e376cbeb3e222db1404e829c987b244b3d1b16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=99=93=E9=A3=9E?= Date: Wed, 5 Feb 2025 11:12:09 +0800 Subject: [PATCH] =?UTF-8?q?Redis=E6=94=AF=E6=8C=81=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E8=A1=A8=E5=88=97=E8=A1=A8=20(#2888)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * showTableName * test_get_all_tables_exception --- sql/engines/redis.py | 18 ++++++++++++++++++ sql/engines/tests.py | 27 +++++++++++++++++++++++++++ sql/templates/sqlquery.html | 2 +- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/sql/engines/redis.py b/sql/engines/redis.py index 1f839988b2..614a18a70f 100644 --- a/sql/engines/redis.py +++ b/sql/engines/redis.py @@ -88,6 +88,24 @@ def get_all_databases(self, **kwargs): result.rows = db_list return result + def get_all_tables(self, db_name, **kwargs): + """获取表列表。Redis的key可以理为表。方法只扫描部分表。起到预览作用。""" + result = ResultSet(full_sql="") + max_results = 100 + table_info_list = [] + try: + conn = self.get_connection(db_name) + scan_rows = conn.scan_iter(match=None, count=20) + for idx, key in enumerate(scan_rows): + if idx >= max_results: + break + table_info_list.append(key) + except Exception as e: + logger.error(f"get_all_tables执行报错,异常信息:{e}") + result.message = f"{e}" + result.rows = table_info_list + return result + def query_check(self, db_name=None, sql="", limit_num=0): """提交查询前的检查""" result = {"msg": "", "bad_query": True, "filtered_sql": sql, "has_star": False} diff --git a/sql/engines/tests.py b/sql/engines/tests.py index cd2ae7bba4..4889b0da96 100644 --- a/sql/engines/tests.py +++ b/sql/engines/tests.py @@ -398,6 +398,33 @@ def test_get_all_databases_with_less_than_15_dbs(self, mock_config_get, mock_inf mock_config_get.assert_called_once_with("databases") mock_info.assert_called_once_with("Keyspace") + @patch( + "redis.Redis.scan_iter", return_value=["table1", "table2", "table3", "table4"] + ) + def test_get_all_tables_success(self, _scan_iter): + # 创建 RedisEngine 实例 + new_engine = RedisEngine(instance=self.ins) + + # 调用 get_all_tables 方法 + db_name = "4" + result = new_engine.get_all_tables(db_name) + mask_result_rows = ["table1", "table2", "table3", "table4"] + # 验证返回的表格信息 + self.assertEqual(result.rows, mask_result_rows) + + @patch("redis.Redis.scan_iter", side_effect=Exception("Test Exception")) + def test_get_all_tables_exception(self, _scan_iter): + # 创建 RedisEngine 实例 + new_engine = RedisEngine(instance=self.ins) + + # 调用 get_all_tables 方法并模拟异常 + db_name = "4" + result = new_engine.get_all_tables(db_name) + + # 验证返回的异常信息 + self.assertEqual(result.rows, []) + self.assertIn(result.message, "Test Exception") + def test_query_check_safe_cmd(self): safe_cmd = "keys 1*" new_engine = RedisEngine(instance=self.ins) diff --git a/sql/templates/sqlquery.html b/sql/templates/sqlquery.html index a9df19faa6..7f52258116 100644 --- a/sql/templates/sqlquery.html +++ b/sql/templates/sqlquery.html @@ -1133,7 +1133,7 @@ } const engineDisplayConfig = { "MsSQL": createDisplayConfig({showExplain: false}), - "Redis": createDisplayConfig({showTableName: false, showSchemaName: false, + "Redis": createDisplayConfig({showTableName: true, showSchemaName: false, showRedisHelp: true, showFormat: false, showExplain: false}), "PgSQL": createDisplayConfig({showSchemaName: true}),