2017-02-10 4 views
0

Dieser Codeabschnitt druckt eine Datenzeile aus, die erwartet wird. Es druckt „Keine“ in der zweiten Reihe, die ich auf als auch eine Erklärung möchte, aber es ist nicht die HauptfragePython-Klasse mit Pyodbc. Fehler in mehreren Zeilen

rows = cursor.fetchone() 
for row in rows: 
    cur = SHIPMENT_BO(row.SHIPMENT_NUM, row.SHIPMENT_ID, row.ORIGIN_BRANCH_CODE, row.DEST_BRANCH_CODE) 
    print(cur.PrintShipment()) 

Dieser Code liefert nur die erste print-Anweisung in der Funktion, aber keine der Daten.

rows = cursor.fetchall() 
for row in rows: 
    cur = SHIPMENT_BO(row.SHIPMENT_NUM, row.SHIPMENT_ID, row.ORIGIN_BRANCH_CODE, row.DEST_BRANCH_CODE) 
    print(cur.PrintShipment()) 

ist die Klasse I oben

class SHIPMENT_BO: 

    def __init__(self, shipNo, shipId, origBranch, destBranch): 
     self.__shipmentNo = shipNo 
     self.__shipmentID = shipId 
     self.__originBranch = origBranch 
     self.__destinationBranch = destBranch 


    def PrintShipment(self): 
     print("Shipment No, Shipment ID, Origin Branch, Destination Branch") 
     print(self.__shipmentNo + " " + str(self.__shipmentID) + " " + self.__originBranch + " " + self.__destinationBranch) 

nennen Wenn ich die Sendungsnummer direkt druckt es Millionen von Zeilen drucken, wie

rows = cursor.fetchall() 
for row in rows: 
    print(row.SHIPMENT_NUM) 
    #cur = SHIPMENT_BO(row.SHIPMENT_NUM, row.SHIPMENT_ID, row.ORIGIN_BRANCH_CODE, row.DEST_BRANCH_CODE) 
    #print(cur.PrintShipment()) 

Meine erste Frage, warum der Code tut, wird erwartet, und Klasse arbeiten für eine Zeile, aber nicht für mehrere Zeilen? Meine zweite Frage ist, warum bekomme ich einen "None" Print nach dem Code mit einer Zeile? Schließlich funktioniert dieser Code überhaupt nicht (keine der print-Anweisungen wird ausgeführt), Sie würden sicherlich mindestens die eine Zeile erhalten, die Sie im Cursor ausgewählt haben.

rows = cursor.fetchone() 
for row in rows: 
    cur = SHIPMENT_BO(row.SHIPMENT_NUM, row.SHIPMENT_ID, row.ORIGIN_BRANCH_CODE, row.DEST_BRANCH_CODE) 
    print(cur.PrintShipment()) 

Antwort

1

re: fetchone() vs. fetchall()

Durch die Verwendung ...

rows = cursor.fetchone() 
for row in rows: 

... es sieht aus wie Sie Pyodbc der fetchone() Methode erwarten eine Liste zurückzukehren enthält ein einzelnes Tupel für die eine Zeile abgerufen, aber es nicht. Es gibt ein pyodbc.Row Objekt zurück. Wenn Sie über das Objekt iterieren Sie iterieren tatsächlich über die Spaltenwerte für diese Zeile:

sql = """\ 
SELECT 'foo' AS col1, 42 AS col2 
""" 
rows = cursor.execute(sql).fetchone() 
for row in rows: 
    print(row) 

foo 
42 

Auf der anderen Seite gedruckt wird, tut fetchall() eine Liste zurück (von pyodbc.Row Objekte), so verhält es sich eher wie Sie

sql = """\ 
SELECT 'foo' AS col1, 42 AS col2 
UNION ALL 
SELECT 'bar' AS col1, 123 AS col2 
""" 
rows = cursor.execute(sql).fetchall() 
for row in rows: 
    print(row) 

druckt erwarten

('foo', 42) 
('bar', 123) 

re: Druck None nach jeder Zeile

Wenn Sie das tun

print(cur.PrintShipment()) 

Sie rufen Ihre PrintShipment Methode, die seine eigene print() Funktion enthält ruft die Spaltenüberschriften und Spalte angezeigt werden Daten. Dann, nachdem die PrintShipment -Methode zurückgibt, sind Sie print -geben Rückgabewert der PrintShipment-Methode, die None ist, weil es eine return Anweisung nicht enthält.Um zu vermeiden, druckt die unechten None Werte rufen Sie einfach die Methode selbst:

cur.PrintShipment() # not wrapped in a print() function 
+0

Danke, das erklärt mein Problem mit der „None“ nach der einzigen Zeile Abfrage gedruckt werden. Haben Sie eine Idee, warum die Klasse nicht für mehrere Zeilen arbeitet, sondern für eine einzelne Zeile funktioniert? Wie ich oben erwähnte, wenn Sie die row.SHIPMENT_NUM explizit drucken, dann druckt es Millionen von Zeilen in der for-Schleife, so dass die Daten extrahiert werden. Gibt es etwas falsches in meiner Syntax, das ich nicht sehe oder nicht verstehe? Warum arbeitet die Klasse für eine Zeile, aber nicht viele? – lem

+0

@lem - * "Hast du eine Idee, warum die Klasse nicht funktioniert" * - Nicht wirklich. [This] (http://pastebin.com/UsvrYWWj) funktioniert gut für mich. –