2012-08-04 10 views
10

より大きい量の項目を持つキー値のPython辞書(またはリスト)があるとします。より大きいJSONファイルを読んでいるとします。そのファイルの内容をMySQLテーブルに格納したいとしましょう。Python辞書/リストをSQLデータベースに挿入する最も効果的な方法は何ですか?

JSON例:

"display_location": { 
    "city":"Bratislava", 
    "state_name":"Slovakia", 
    "country_iso3166":"SK", 
    "latitude":"48.20000076", 
    "longitude":"17.20000076", 
} 

そして、手動で次のように挿入するSQLを記述するのは非常に非効率的である:

INSERT INTO TABLE (city, state_name, country_iso3166, latitude, longitude) VALUES('%s','%s','%s','%s','%s') 
% (Bratislava, Slovakia, SK, 48.20000076, 17.20000076); 

(まあ、それは5つの値を持つOKですが、たとえば5のためにそこにいると想像何百もあります)

効果的で短い文字列のSQL挿入のためのPythonクラス/メソッドはありますか?インサートが、はるかにシンプルに見えるその後

for key,value in list.iteritems(): 
    value_type = type(value) 
    if value_type is unicode: 
     vars_to_sql.append(value.encode('ascii', 'ignore')) 
     keys_to_sql.append(key.encode('ascii', 'ignore')) 
    else: 
     vars_to_sql.append(value) 
     keys_to_sql.append(key) 

keys_to_sql = ', '.join(keys_to_sql) 

:私は、コードのこの作品を書いた

INSERT INTO conditions_bratislava(%s) VALUES %r" % (keys_to_sql, tuple(vars_to_sql),) 

あり値の何千もすることができ、あなたはまだこの1つのinsert文で罰金になります。

Unicode文字列をデコードする条件に注意してください。したがって、各値の前に "u"文字はありません。

したがって、短いINSERT文字列を使用して同じ単純な方法で多くの値を挿入する方法が、より効果的で準備されたクラスまたはメソッドですか?

+1

リレーショナルデータベースを使用する場合は、ネイティブなJSONデータ型を持つPostgreSQL 9.2を使用してください。 –

答えて

6

あなたのデータは、そのように構成されている場合、それはより多くのドキュメント指向のデータベースへの自分自身を貸すだろう(モンゴ/ソファーなど...)

あなたはこのような何かを離れて得ることができます...私はreprを使って考えます少しも賢い...サイドノートで

insert_sql = 'INSERT INTO conditions_bratislava(%s) values(%s)' 
cols = ', '.join(somedict) 
vals = ', '.join('?' * len(somedict)) # or whatever qparam is required 
to_execute = insert_sql % (cols, vals) 
some_cursor.execute(to_execute, somedict.values()) 

がされている:

value_type = type(value) 
if value_type is unicode: 

ように記述する必要があります。

if isinstance(value, unicode): 
+0

'isinstance'の+1 –

+0

dictが2番目のスレッドで修正された場合、値の順序が正しくないか、値が多すぎる可能性があります。代わりに名前付きのパラメータを使って、辞書全体をcursor.executeに渡します。 – XORcist

+0

@möter私はOPがやっていたことの「より正確な」バージョンを提供していました。私は、名前付きのパラメータを使用することは一般的にはやや良いことに同意します。スレッドを使用している人は、ロックを使用するのに十分気をつけてください。 –

関連する問題