2016-04-05 4 views
0

MySQLDbライブラリでexecutemanyを使用するマルチクエリを実行しようとしています。周りに検索した後、私は私がexecutemanypython-mysqlで変数のリストを取り込むクエリコマンドを作成することは可能ですか?

すべてが今のところ良いですが、使用するためにはON DUPLICATE KEY代わりのUPDATEとともにINSERT INTOを使用するコマンドを作成する必要がありますことを発見し、私は問題に実行している私ができます」 SETの部分を効率的に設定します。私のテーブルは約20列あります(テーブルの肥満を批判したいかどうかはあなた次第です)。私は可能な限り効率的にコマンドストリングを形成したいと思います。

今私はall_columnsは、すべての列をカバーし、私は後でexecutemanyを使用するつもりだとしてヴァルスが%sの束をカバー

update_query = """ 
       INSERT INTO `my_table` 
       ({all_columns}) VALUES({vals}) 
       ON DUPLICATE KEY SET <should-have-each-individual-column-set-to-value-here> 
       """.format(all_columns=all_columns, vals=vals) 

を持っています。

しかし、私はどのように文字列のSET部分を形成するか分かりません。コンマ分割を使ってリスト内の要素に分割することを考えましたが、反復できるかどうかはわかりません。

全体的に、この目標は更新のために一度だけdbを呼び出すことです。これが私が今考えている唯一の方法です。もっと良いアイデアがある場合は、私にも知らせてください。

EDIT:追加の詳細情報

all_columnsは今ちょうど4

答えて

1

よりも多くの列がある'%s, %s, %s, %s'

そしてもちろんに設定されている'id, id2, num1, num2'

valsのようなものです設定したコマンドのタプルのリストがあるとします:

listUpdate = [('f1', 'i'), ('f2', '2')] 

setCommand = ', '.join([' %s = %s' % x for x in listUpdate]) 
all_columns = 'id, id2, num1, num2' 
vals = '%s, %s, %s, %s' 

update_query = """ 
       INSERT INTO `my_table` 
       ({all_columns}) VALUES({vals}) 
       ON DUPLICATE KEY SET {set} 
       """.format(all_columns=all_columns, vals=vals, set=setCommand) 

print(update_query) 
+0

まずはお返事ありがとうございます。質問: '.executemany(update_query、data)'を実行すると、 'data'はすべての値のタプルのリストです。このクエリはまだ動作しますか? – JChao

+0

私は別の記事で、コマンドの 'SET'部分が' UPDATE id2 = VALUES(id2) 'となることに気付きました。タプルの最初の要素を '' id2''に設定し、次に '' VALUES(id2)'''を設定するとどうなりますか? – JChao

+0

はい、動作します!どうもありがとう! – JChao

関連する問題