fix: 查询模板占位符替换 + _auto_add_limit 跳过非SELECT语句 + 默认用户密码修正

修复:
- getTemplateSQL() 支持 {table}/{db}/{collection} 占位符自动替换
- _auto_add_limit() 仅对 SELECT 语句添加 LIMIT, SHOW/DESC/EXPLAIN 跳过
- seed_data 默认用户密码从 '***' 改为 'admin123'
- DB 中已有用户密码已重置为 admin123

测试: 75 passed (新增2个 SHOW/DESC LIMIT 测试)
This commit is contained in:
logan committed 2026-05-24 15:32:51 +08:00
1 parent 0fb947dcb5
commit 0aa4595c90
4 files changed
+35 -9

No files matched your search

+10 -2
View File
@@ -415,8 +415,11 @@ class SQLQueryHandlerBase(BaseQueryHandler):
if re.search(r"\b(Exec|Execute|Sp_|Xp_)", query, re.IGNORECASE):
raise QuerySecurityError("存储过程调用在查询模式中被禁止")
# 不需要添加 LIMIT 的语句前缀
_NO_LIMIT_PREFIXES = ("SHOW", "DESC", "DESCRIBE", "EXPLAIN", "WITH")
def _auto_add_limit(self, sql: str, max_rows: int = MAX_ROWS) -> str:
"""如果 SQL 没有 LIMIT 则自动添加。
"""如果 SQL 没有 LIMIT 则自动添加。仅对 SELECT 语句生效。
Args:
sql: 原始 SQL
@@ -426,7 +429,12 @@ class SQLQueryHandlerBase(BaseQueryHandler):
添加了 LIMIT 的 SQL
"""
upper_sql = sql.strip().upper()
# 更精确的 LIMIT 检测(避免匹配字符串中的 LIMIT 字样)
# SHOW / DESC / EXPLAIN 等语句不支持 LIMIT(或语义不同),跳过
if any(upper_sql.startswith(p) for p in self._NO_LIMIT_PREFIXES):
return sql
# 仅对 SELECT 语句添加 LIMIT
if not upper_sql.startswith("SELECT"):
return sql
if not self._has_limit_clause(upper_sql):
sql = sql.rstrip(";") + f" LIMIT {max_rows}"
return sql