2017-01-16 1 views
0

Ich habe ein wiederkehrendes Problem, wenn ich MSSQL-Abfragen mit Pymssql durchführen.pymssql: entfernen oder ersetzen NULL-Werte aus Ergebniszeilen

Dies ist der Code ich benutze:

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) 

Die listOfRows Liste endet als Liste Tupel up wie:

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

Beachten Sie, dass die keine Werte Tupel haben, sondern auch die Liste endet immer mit dem letzten Wert, der auch None ist.

Viele Operationen, die ich mit diesen Ergebnissen versuche, geben mir einen Fehler. Zum Beispiel:

[list(x) for x in listOfRows] 

Ergebnisse in dem Fehler:

TypeError: 'NoneType' object is not iterable 

Gibt es einen effizienten Weg, um dieses Problem zu vermeiden? Die Lösung kann entweder auf Abfrageebene oder mit einer Python-Methode sein. Ich verbringe viel Zeit damit, für Schleifen zu schreiben, um keine Werte zu entfernen.

+0

Wenn 'listOfRows' tatsächlich '[(' wert1 ', keine,' wertx '), (keine,' wert2 ',' wertx ')]' 'ist, wird dieser Fehler nicht angezeigt. Da ist noch etwas mehr los. – Mureinik

Antwort

2

Sie haben die Logik in Ihrer while Schleife durcheinander gebracht. Derzeit holen Sie die Zeile aus der DB, hängen sie an die Liste an und prüfen dann, ob die Zeile nicht None war. Aufgrund dieser Tatsache sind Sie mit Eintrag als None am Ende der Liste:

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

Stattdessen sollten Sie die Zeile aus DB, prüfen None holen und fügen es dann aufzulisten. Daher sollte Ihr Code:

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

Auch in Ihrer aktuellen Logik überspringen Sie den Inhalt der ersten Zeile.