2016-05-22 1 views
1

の取り扱いは、ここにコードがある:MySQLdbはとPython KeyError例外は、私は、MySQLのテーブルに複数の値を追加しようとしています

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 

問題は、このコードは、ループ内で、時代beiingある値のいずれかであることです挿入された文字列が欠けてしまい、挿入全体をキャンセルするキーエラーが発生します。

KeyErrorをどのように回避すればよいのですか?挿入されているアイテムのうちの1つに関連するKeyErrorが発生しても、テーブルに追加されたKeyErrorがあり、欠落しているアイテムはNULLのままです。

答えて

1

dict.get() methodは、辞書にキーが見つからない場合はNoneを返します。 MySQLドライバクエリパラメータ化ステップの間にNULLNoneを変換します:

# 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

が魅力のように働いた、ありがとうございました!ただ好奇心が強い、なぜあなたは説明と名前を別々に扱わなければならなかったのですか? –

+0

申し訳ありませんが、私はこれを早すぎると言いました。今、私はループを介して実行しているとき私はこのエラーが発生しています:割り当ての前にローカル変数 'item'が参照されました –

+0

@ KamilMieczakowskiは、サブディクショナリからアイテムを取得することを含むので、別名と説明を別々に扱わなければなりませんでした。あなたはそれを使用している前に 'アイテム'を定義しています。ありがとう。 – alecxe

関連する問題