2017-01-16 2 views
0

pymssql을 사용하여 MSSQL 쿼리를 수행 할 때 반복 문제가 발생했습니다. 또한 튜플 없음 값을 가지고pymssql : 결과 행의 NULL 값 제거 또는 대체

[('value1', None, 'valuex'), (None, 'value2', 'valuex'), None] 

주의 사항 :하지만,

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 목록과 같은 목록 튜플로 끝나는 :

은 내가 사용 코드입니다 목록은 항상 마지막 값도 없음으로 끝납니다.

이러한 결과로 수행하려고하는 많은 작업에서 오류가 발생합니다. 오류에

[list(x) for x in listOfRows] 

결과 :이 문제를 방지 할 수있는 효율적인 방법은

TypeError: 'NoneType' object is not iterable 

거기 예를 들면? 솔루션은 쿼리 수준 또는 파이썬 방법 중 하나 일 수 있습니다. 나는 None 값을 제거하기 위해 많은 시간을 루프에 쓰는 데 소비한다고 생각한다.

+0

'listOfRows'가 참으로'[('value1', None, 'valuex'), (None, 'value2', 'valuex')]'이면이 오류가 발생하지 않습니다. 여기에 더 많은 것이 있습니다. – Mureinik

답변

2

while 루프의 논리가 엉망입니다. 현재 DB에서 행을 가져 와서 목록에 추가 한 다음 행이 None이 아닌지 확인합니다. 이 때문에, 당신은 당신의 목록의 마지막에 None 등의 항목을 겪고있는 대신

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

, 당신은 None 확인, DB에서 행을 인출 한 후 목록에 추가해야합니다. 따라서 귀하의 코드는 다음과 같아야합니다 :

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

또한, 첫 번째 행의 내용을 건너 뛰었습니다.