Skip to content

Commit 7ca0793

Browse files
feiazifeiazi王飞
and
王飞
authored
对Redis的返回结果进行类型判断,如果是dict,list转为json字符串 (#2690)
Co-authored-by: 王飞 <[email protected]>
1 parent c544f10 commit 7ca0793

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

sql/engines/redis.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@time: 2019/03/26
77
"""
88

9+
import json
910
import re
1011
import shlex
1112

@@ -119,6 +120,7 @@ def query_check(self, db_name=None, sql="", limit_num=0):
119120
"zcard",
120121
"zcount",
121122
"zrank",
123+
"info",
122124
]
123125
# 命令校验,仅可以执行safe_cmd内的命令
124126
for cmd in safe_cmd:
@@ -147,7 +149,19 @@ def query(self, db_name=None, sql="", limit_num=0, close_conn=True, **kwargs):
147149
result_set.affected_rows = len(rows)
148150
elif isinstance(rows, dict):
149151
result_set.column_list = ["field", "value"]
150-
result_set.rows = tuple([[k, v] for k, v in rows.items()])
152+
# 对Redis的返回结果进行类型判断,如果是dict,list转为json字符串。
153+
pairs_list = []
154+
for k, v in rows.items():
155+
if isinstance(v, dict):
156+
processed_value = json.dumps(v)
157+
elif isinstance(v, list):
158+
processed_value = json.dumps(v)
159+
else:
160+
processed_value = v
161+
# 添加处理后的键值对到列表
162+
pairs_list.append([k, processed_value])
163+
# 将列表转换为元组并赋值给 result_set.rows
164+
result_set.rows = tuple(pairs_list)
151165
result_set.affected_rows = len(result_set.rows)
152166
else:
153167
result_set.rows = tuple([[rows]])

sql/engines/tests.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,29 @@ def test_query_execute(self, _execute_command):
298298
self.assertIsInstance(query_result, ResultSet)
299299
self.assertTupleEqual(query_result.rows, (["text"],))
300300

301+
@patch("redis.Redis.execute_command")
302+
def test_query_with_dict_response(self, _execute_command):
303+
# 定义 execute_command 的字典响应
304+
dict_response = {
305+
"key1": "value1",
306+
"key2": {"subkey": "subvalue"},
307+
"key3": ["listitem1", "listitem2"],
308+
}
309+
_execute_command.return_value = dict_response
310+
new_engine = RedisEngine(instance=self.ins)
311+
query_result = new_engine.query(db_name=0, sql="keys *", limit_num=100)
312+
313+
# 验证结果集
314+
expected_rows = [
315+
["key1", "value1"],
316+
["key2", json.dumps({"subkey": "subvalue"})],
317+
["key3", json.dumps(["listitem1", "listitem2"])],
318+
]
319+
self.assertIsInstance(query_result, ResultSet)
320+
self.assertEqual(query_result.column_list, ["field", "value"])
321+
self.assertEqual(query_result.rows, tuple(expected_rows))
322+
self.assertEqual(query_result.affected_rows, len(expected_rows))
323+
301324
@patch("redis.Redis.config_get", return_value={"databases": 4})
302325
def test_get_all_databases(self, _config_get):
303326
new_engine = RedisEngine(instance=self.ins)

0 commit comments

Comments
 (0)