Skip to content

Commit 38e376c

Browse files
authored
Redis支持显示表列表 (#2888)
* showTableName * test_get_all_tables_exception
1 parent 69e29b1 commit 38e376c

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

sql/engines/redis.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,24 @@ def get_all_databases(self, **kwargs):
8888
result.rows = db_list
8989
return result
9090

91+
def get_all_tables(self, db_name, **kwargs):
92+
"""获取表列表。Redis的key可以理为表。方法只扫描部分表。起到预览作用。"""
93+
result = ResultSet(full_sql="")
94+
max_results = 100
95+
table_info_list = []
96+
try:
97+
conn = self.get_connection(db_name)
98+
scan_rows = conn.scan_iter(match=None, count=20)
99+
for idx, key in enumerate(scan_rows):
100+
if idx >= max_results:
101+
break
102+
table_info_list.append(key)
103+
except Exception as e:
104+
logger.error(f"get_all_tables执行报错,异常信息:{e}")
105+
result.message = f"{e}"
106+
result.rows = table_info_list
107+
return result
108+
91109
def query_check(self, db_name=None, sql="", limit_num=0):
92110
"""提交查询前的检查"""
93111
result = {"msg": "", "bad_query": True, "filtered_sql": sql, "has_star": False}

sql/engines/tests.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,33 @@ def test_get_all_databases_with_less_than_15_dbs(self, mock_config_get, mock_inf
398398
mock_config_get.assert_called_once_with("databases")
399399
mock_info.assert_called_once_with("Keyspace")
400400

401+
@patch(
402+
"redis.Redis.scan_iter", return_value=["table1", "table2", "table3", "table4"]
403+
)
404+
def test_get_all_tables_success(self, _scan_iter):
405+
# 创建 RedisEngine 实例
406+
new_engine = RedisEngine(instance=self.ins)
407+
408+
# 调用 get_all_tables 方法
409+
db_name = "4"
410+
result = new_engine.get_all_tables(db_name)
411+
mask_result_rows = ["table1", "table2", "table3", "table4"]
412+
# 验证返回的表格信息
413+
self.assertEqual(result.rows, mask_result_rows)
414+
415+
@patch("redis.Redis.scan_iter", side_effect=Exception("Test Exception"))
416+
def test_get_all_tables_exception(self, _scan_iter):
417+
# 创建 RedisEngine 实例
418+
new_engine = RedisEngine(instance=self.ins)
419+
420+
# 调用 get_all_tables 方法并模拟异常
421+
db_name = "4"
422+
result = new_engine.get_all_tables(db_name)
423+
424+
# 验证返回的异常信息
425+
self.assertEqual(result.rows, [])
426+
self.assertIn(result.message, "Test Exception")
427+
401428
def test_query_check_safe_cmd(self):
402429
safe_cmd = "keys 1*"
403430
new_engine = RedisEngine(instance=self.ins)

sql/templates/sqlquery.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1133,7 +1133,7 @@ <h4 class="modal-title text-danger">收藏语句</h4>
11331133
}
11341134
const engineDisplayConfig = {
11351135
"MsSQL": createDisplayConfig({showExplain: false}),
1136-
"Redis": createDisplayConfig({showTableName: false, showSchemaName: false,
1136+
"Redis": createDisplayConfig({showTableName: true, showSchemaName: false,
11371137
showRedisHelp: true,
11381138
showFormat: false, showExplain: false}),
11391139
"PgSQL": createDisplayConfig({showSchemaName: true}),

0 commit comments

Comments
 (0)