Skip to content

Commit

Permalink
Redis支持显示表列表 (#2888)
Browse files Browse the repository at this point in the history
* showTableName

* test_get_all_tables_exception
  • Loading branch information
feiazifeiazi authored Feb 5, 2025
1 parent 69e29b1 commit 38e376c
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
18 changes: 18 additions & 0 deletions sql/engines/redis.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down
27 changes: 27 additions & 0 deletions sql/engines/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion sql/templates/sqlquery.html
Original file line number Diff line number Diff line change
Expand Up @@ -1133,7 +1133,7 @@ <h4 class="modal-title text-danger">收藏语句</h4>
}
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}),
Expand Down

0 comments on commit 38e376c

Please sign in to comment.