This commit is contained in:
HuangHai
2026-01-20 08:21:08 +08:00
parent 34501faafb
commit a5e8da0f9e
11 changed files with 1044 additions and 1215 deletions

View File

@@ -253,20 +253,30 @@ class Db:
processed_sql = sql_template
# 处理#if条件判断
# 修复正则表达式,确保正确匹配条件块
if_pattern = r'#if\((\w+)\)([\s\S]*?)#end'
# 修复正则表达式,确保正确匹配条件块,支持 ! 取反
if_pattern = r'#if\((!?\w+)\)([\s\S]*?)#end'
# 使用finditer来获取匹配的位置信息
matches = list(re.finditer(if_pattern, processed_sql))
# 从后向前替换,避免位置偏移问题
for match in reversed(matches):
param_name = match.group(1)
raw_param_name = match.group(1)
sql_block = match.group(2)
# 处理取反逻辑
is_negation = raw_param_name.startswith('!')
param_name = raw_param_name[1:] if is_negation else raw_param_name
# 检查参数是否存在且不为None
if param_name in params and params[param_name] is not None:
# 如果条件为真保留SQL块
# 检查参数是否存在且不为None (且不为空,如果需要更严格的检查)
# 这里保持原逻辑基础上增加对空值的判定因为空列表通常也意味着False
has_value = param_name in params and params[param_name] is not None and params[param_name]
# 决定是否保留代码块
keep_block = (not has_value) if is_negation else has_value
if keep_block:
# 如果条件满足保留SQL块
# 移除多余的空白行和缩进
lines = sql_block.strip().split('\n')
cleaned_lines = [line.strip() for line in lines if line.strip()]
@@ -275,11 +285,11 @@ class Db:
# 替换原始匹配的内容
processed_sql = processed_sql[:match.start()] + cleaned_block + processed_sql[match.end():]
logger.debug(f"保留条件块 #if({param_name}),内容: {cleaned_block}")
logger.debug(f"保留条件块 #if({raw_param_name}),内容: {cleaned_block}")
else:
# 如果条件为假,移除整个条件块
# 如果条件不满足,移除整个条件块
processed_sql = processed_sql[:match.start()] + "" + processed_sql[match.end():]
logger.debug(f"移除条件块 #if({param_name})")
logger.debug(f"移除条件块 #if({raw_param_name})")
# 创建参数字典的副本,用于存储处理后的参数
if params is not None:

Binary file not shown.