You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套循环多变量迭代:近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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:18:17