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

pymssql: remove or replace NULL values from result rows

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

您搞乱了 while 循环中的逻辑。目前您从数据库中获取行,将其附加到列表中,然后检查该行是否不是 None。因此,您在列表末尾的条目为 None

[('value1', None, 'valuex'), (None, 'value2', 'valuex'), None]
#                                   single `None` object  ^

相反,您应该从数据库中获取行,检查 None,然后将其附加到列表中。因此你的代码应该是:

cursor.execute(query)
row = cursor.fetchone()
while row:
    listOfRows.append(row)     # <- Interchanged
    row = cursor.fetchone()    # <-- Lines

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