当我使用pymssql执行MSSQL查询时,我遇到了一个反复出现的问题。
这是我使用的代码:
listOfRows = [] # I will append all reult rows to this list
conn = pymssql.connect(user = 'the user', password = 'password', server = 'theserver', database = 'thedb')
cursor = conn.cursor()
query = 'SELECT * FROM table'
cursor.execute(query)
row = cursor.fetchone()
while row:
row = cursor.fetchone()
listOfRows.append(row)
listOfRows列表最终作为列表元组,例如:
[('value1', None, 'valuex'), (None, 'value2', 'valuex'), None]
请注意,元组的值为None,但列表总是以其最后一个值也为None。
我尝试对这些结果进行的许多操作都会给我一个错误。例如:
[list(x) for x in listOfRows]
导致错误:
TypeError: 'NoneType' object is not iterable
有没有一种有效的方法来避免这个问题?解决方案可以是查询级别,也可以是Python方法。我发现自己花了很多时间来编写for循环以删除None值。
答案 0 :(得分:2)
你搞砸了while
循环中的逻辑。目前,您从DB获取行,将其附加到列表中,然后检查该行是否不是None
。因此,您在列表末尾输入None
:
[('value1', None, 'valuex'), (None, 'value2', 'valuex'), None]
# single `None` object ^
相反,您应该从DB中获取行,检查None
然后将其附加到列表中。因此,您的代码应该是:
cursor.execute(query)
row = cursor.fetchone()
while row:
listOfRows.append(row) # <- Interchanged
row = cursor.fetchone() # <-- Lines
此外,在您当前的逻辑中,您正在跳过第一行的内容。