2016-05-22 2 views
1

JSONファイルを返すAPIを反復するループを介してMySQLデータベースにデータを追加しようとしています。私はPythonとMySQLdbモジュールを使用しています。MySQLデータベースのエラーローカル変数が割り当て前に参照されています(通常とは異なります)

何らかの理由で、私は悪名高いUnboundLocalErrorを取得しています。私は、この問題が発生し、既にStackOverflowで答えられている他のシナリオを見ましたが、何も私と共鳴しなかったので、この問題に直接適用できませんでした。ここで

は私のコードです:

def request(API_KEY, URL, ch_no): 
    url = URL + ch_no + '/request' 
    request = requests.get(url, auth=(API_KEY, '')) 
    data_dict = request.json() 
    data_dict_json_dumps = json.dumps(data_dict) 
    data = json.loads(data_dict_json_dumps) 

    try: 
     for item in data['items']: 
      return (item['tag'], item['created_on'], item['delivered_on'], item['satisfied_on'], item['status'], item['particulars']['description'], item['persons_entitled'][0]['name']) 
    except KeyError: 
     pass 

    try: 
     description = item['particulars']['description'] 
    except KeyError: 
     description = None 
    try: 
     persons_entitled = item['persons_entitled'][0]['name'] 
    except KeyError: 
     persons_entitled = None 

    try: 
     cursor.execute("""INSERT INTO companies_and_charges_tmp (tags, company_id, created, delivered, satisfied, status, description, persons_entitled) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)""", (item.get('tag'), ch_no, item.get('created_on'), item.get('delivered_on'), item.get('satisfied_on'), item.get('status'), description, persons_entitled)) 
    db.commit() 

    finally: 
     time.sleep(0.5) 

    del data 

for ch_no in ch_nos: 
    charges_request(API_KEY, URL, ch_no) 

そして、ここでは完全な誤りだ:

Traceback (most recent call last): 
    File "test2.py", line 58, in <module> 
    charges_request(API_KEY, URL, ch_no) 
    File "test2.py", line 49, in charges_request 
    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, persons_entitled)) 
UnboundLocalError: local variable 'item' referenced before assignment 

答えて

2

問題は、forループを入力したときにitemにのみ割り当てられていることである

for item in data['items']: 
    ... 

data['items']が空の場合は決して実行しないでください。itemは未割り当てのままです。

1

このスクリプトのループを反復処理し、返された変数のいくつかは(当然そう)その後、NULLのpythonであるため、スロー変数としてのUnboundLocalErrorは存在しない、または宣言されていません。私が使用してこの問題に対処しようとし

except KeyError: 

はしかし、私たちがここで扱っているエラーはそう一つだけのエラーのが効果的ではなかったハンドリング、KeyErrorsもUnboundLocalErrorsだけではありません。

私は次のように(あなたの心これは私が同じ構文は、Python 3で可能であるならばわからないのPython 2.7で動作します)でスクリプトを修正:MySQLデータベースにデータを追加するときに

try: 
    description = item['particulars']['description'] 
except (UnboundLocalError, KeyError): 
    #declaring the description as None if not there so MySQL/Python don't throw an error 
    description = None 

とあれば、私はまた、エラーハンドラを使用して渡しています:

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.get('etag'), ch_no, item.get('created_on'), item.get('delivered_on'), item.get('satisfied_on'), item.get('status'), description, persons_entitled)) 
    db.commit() 
except UnboundLocalError: 
    pass 
関連する問題