'commit'
This commit is contained in:
28
DbKit/Db.py
28
DbKit/Db.py
@@ -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.
Reference in New Issue
Block a user