For循环似乎跳过列表中的某些项目

时间:2014-10-03 14:31:30

标签: python pyodbc openpyxl

我一直在研究一个使用pyodbc的项目,该项目从我们的数据库中提取系列名称列表,然后从后续表中迭代地提取每个系列的数据,并将其写入电子表格。这是一个展示这个想法的精简版本。

def Run(Family):
    names = []

    con = pyodbc.connect("...")
    cursor = con.cursor()

    cursor.execute("SELECT DISTINCT ... ")
    for item in cursor:
        names.append(item[0])
        #print(item[0], 1)

    for name in names:
        cursor.execute("SELECT DISTINCT <data> FROM <tables> WHERE name = ?", name)
        for item in cursor:
            #print(item[0], 2)
            name = item[0]
            age = item[1]
            income = item[2]
            etc...

        <Write to spreadsheet>

我遇到的问题是循环似乎跳过列表中的某个名称。在调查时我发现第一个(注释的)print语句确实打印了名称,但是在那里和第二个print语句之间,它就消失了。

奇怪的是,如果我将另一个打印语句放在我写入电子表格的下方,名称又回来了,但因为它没有通过第二个光标,所以没有提取数据,因此电子表格只显示该名称包含之前名称中的所有信息。

我一直在试图弄清楚发生了什么,但实际上看不到会导致这种情况的任何事情。如有任何想法或任何其他可能有用的信息,请与我们联系。谢谢!

Update1:​​我按照你的建议修复了迭代器名称,但这并没有解决它留下名字的问题。正如我所指出的那样,不是每个名字都是这样做的,每次都只有一个名字。

Update2:我也按你的建议修复了查询,虽然在这种情况下sql注入不应该是威胁,因为“name”不是由用户输入的,而是从另一个字段中提取的在同一个数据库中,该数据库仅由我团队的其他成员管理。

3 个答案:

答案 0 :(得分:2)

您的问题是使用变量名称&#34; item&#34;在循环中然后是它的嵌套循环。尝试将项目重命名为其他类似的东西

def Run(Family):
    names = []

    con = pyodbc.connect("...")
    cursor = con.cursor()

    cursor.execute("SELECT DISTINCT ... ")
    for item in cursor:
        names.append(item[0])
        #print(item[0], 1)

    for item in names:
        cursor.execute("SELECT DISTINCT <data> FROM <tables> WHERE name = " + item)
        for family_data in cursor:
            #print(family_data[0], 2)
            name = item
            age = family_data[1]
            income = family_data[2]
            etc...

        <Write to spreadsheet>

答案 1 :(得分:2)

对于这部分:

for item in names:
    cursor.execute("SELECT DISTINCT <data> FROM <tables> WHERE name = " + name)
    for item in cursor:

我很确定你的意思

for name in names:
    cursor.execute("SELECT DISTINCT <data> FROM <tables> WHERE name = " + name)
    for item in cursor:

请注意,我将第一个迭代器从item更改为name。您正在调用item

答案 2 :(得分:-1)

谢谢大家。我发现问题实际上是在SQL语句中,而不是Python部分。故障系列中的一个值是NULL,因为我是SQL的新手,我只使用了&#39; join&#39;而不是左连接&#39;,它将整个游标返回为空,而不仅仅是该字段。