嵌套循环多变量迭代:近10天数据匹配IF语句未触发排查
你遇到的核心问题是代码里的几个关键逻辑错误,导致明明数据库里存在匹配的account,却总是进入else分支。我们一步步拆解并修复:
1. 游标fetchall()的位置错误
你把dupcursor.fetchall()放在了account的内层循环里——游标是单向的,第一次调用fetchall()会把所有数据取出来,后续再调用就只能拿到空列表了!这直接导致后面的account循环根本没数据可查。
修复:提前一次性取出所有数据存到变量里,后续循环直接遍历这个列表:
# 先执行查询并取出所有行,放在外层 dupcursor.execute(qselectall) all_rows = dupcursor.fetchall()
2. 内层row循环的逻辑致命错误
当前代码里,只要第一行不满足匹配条件,就直接执行else并break——相当于只检查了第一行就判定没有匹配,完全忽略了后面的所有行!这是导致你一直看到"No"的最主要原因。
修复:先遍历所有行标记是否找到匹配,只有当所有行都遍历完仍未找到时,才输出"No":
for account, email in zip(account_numbers, email_address): print(account) found_dup = False # 遍历所有行找匹配 for row in all_rows: if current_date_str == row[4] and str(account) == str(row[0]): print("Yes there are DUPS") found_dup = True break # 找到就跳出row循环 # 所有行遍历完后再判断 if not found_dup: print("No there are no DUPS")
3. 循环变量名冲突
外层循环用i做计数器,之后又把i赋值为日期:i = start_date - i * day_delta,这会导致变量混淆,虽然暂时可能运行,但很容易引发后续bug。
修复:把日期变量改成独立的名字,比如current_date:
start_date = datetime.date.today() # 如果要最近10天,把7改成10 end_date = start_date + 10 * day_delta for delta_days in range((end_date - start_date).days): current_date = start_date - delta_days * day_delta current_date_str = str(current_date) # 提前转成字符串,避免重复转换
4. 数据类型不匹配问题
你的account_numbers来自DataFrame,大概率是整数类型,而数据库中row[0]的account_number可能是字符串类型,直接用account == row[0]会导致不匹配。
修复:把两边统一转成字符串再比较:str(account) == str(row[0])
5. 日期匹配的精确性优化
用str(i) in row[4]可能会匹配到意外内容(比如row[4]有额外字符),既然你已经用to_char(load_date, 'YYYY-MM-DD')转成了标准格式,直接用精确相等更可靠:current_date_str == row[4]
完整修复后的代码
import datetime from pandas import DataFrame day_delta = datetime.timedelta(days=1) qselectall = '''select account_number, proc_date, email_address, cy_day,to_char(load_date, 'YYYY-MM-DD') from sumb_email_conf''' dupcursor.execute(qselectall) all_rows = dupcursor.fetchall() # 预先取出所有数据 start_date = datetime.date.today() # 改为10天来覆盖最近10天的数据 end_date = start_date + 10 * day_delta for delta_days in range((end_date - start_date).days): current_date = start_date - delta_days * day_delta current_date_str = str(current_date) df = DataFrame(accounts_sheet) # 先过滤一次,避免重复执行过滤逻辑 filtered_df = df[df['cycle_day'] == current_cycle_day] email_address = filtered_df.email_address_test account_numbers = filtered_df.account_number for account, email in zip(account_numbers, email_address): print(account) found_dup = False for row in all_rows: # 精确匹配日期和账号 if current_date_str == row[4] and str(account) == str(row[0]): print("Yes there are DUPS") found_dup = True break if not found_dup: print("No there are no DUPS")
内容的提问来源于stack exchange,提问作者ajburnett344

