我一直在研究一个使用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”不是由用户输入的,而是从另一个字段中提取的在同一个数据库中,该数据库仅由我团队的其他成员管理。
答案 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;,它将整个游标返回为空,而不仅仅是该字段。