pymssql:从结果行中删除或替换NULL值

时间:2017-01-16 22:02:32

标签: python sql-server pymssql

当我使用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值。

1 个答案:

答案 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

此外,在您当前的逻辑中,您正在跳过第一行的内容。