2016-05-22 11 views
1

ich mehrere Werte MySQL-Tabelle hinzuzufügen bin versucht, hier ist der Code:MySQLdb und Python KeyError Handhabung

Try: 
cursor.execute("INSERT INTO companies_and_charges_tmp (etags, company_id, created, delivered, satisfied, status, description, persons_entitled) VALUES ('%s, %s, %s, %s, %s, %s, %s, %s')" % (item['etag'], ch_no, item['created_on'], item['delivered_on'], item['satisfied_on'], item['status'], item['particulars'][0]['description'], item['persons_entitled'][0]['name'])) 

Except KeyError: 
    pass 

Das Problem ist, dass dieser Code in der Schleife ist und manchmal einer der Werte, die beiing sind eingefügt wird, was dazu führt, dass Key Error die gesamte Einfügung aufhebt.

Wie komme ich an KeyError vorbei, wenn also der KeyError für eines der einzufügenden Elemente eintritt, werden andere noch zur Tabelle hinzugefügt und die fehlende fehlt einfach als NULL?

Antwort

1

Sie können die dict.get() method verwenden, die None zurückgeben würde, wenn ein Schlüssel nicht in einem Wörterbuch gefunden würde. MySQL Fahrer würde dann None-NULL während des Schritts Abfrage Parametrierung konvertieren:

# handling description and name separately 
try: 
    description = item['particulars'][0]['description'] 
except KeyError: 
    description = None 

# TODO: violates DRY - extract into a reusable method? 
try: 
    name = item['persons_entitled'][0]['name'] 
except KeyError: 
    name = None 

cursor.execute(""" 
    INSERT INTO 
     companies_and_charges_tmp 
     (etags, company_id, created, delivered, satisfied, status, description, persons_entitled) 
    VALUES 
     (%s, %s, %s, %s, %s, %s, %s, %s)""", 
    (item.get('etag'), ch_no, item.get('created_on'), item.get('delivered_on'), item.get('satisfied_on'), item.get('status'), description, name)) 
+0

wie ein Charme, danke! Nur neugierig, warum mussten Sie Beschreibung und Namen getrennt behandeln? –

+0

Sorry, ich habe das zu früh gesagt. Jetzt, wenn ich es durch die Schleife laufen lasse, erhalte ich diesen Fehler: lokales variables 'Einzelteil' referenzierte vor Zuweisung –

+0

@KamilMieczakowski musste den Namen und die Beschreibung separat behandeln, da es Einzelteile von den subdictionaries .. als für den Fehler erhält, sicherstellen Du hast 'Item' definiert, bevor du es benutzt. Vielen Dank. – alecxe