2016-05-03 33 views
1

私は何百万という行をMySQLに更新する必要があります。私は現在、クエリを実行するためにループを使用しています。アップデートを速くするために、Python MySQL Connectorのexecutemany()を使いたいので、バッチごとに単一のクエリを使ってバッチを更新することができます。Pythonで一括更新MySql

+1

ニース..しかし、私は質問を見ていませんか? – Marco

+0

基本的に私はpythonでの更新のためにexecutemanyを使用したいと思います。出来ますか ? – keshaw

+0

私はそうは思わない – Marco

答えて

1

ことができます。

ただし、最後にON DUPLICATE KEY UPDATE条件を指定したINSERTクエリを使用できます。

使いやすく読みやすくするために、次の例を書きました。 1つのライナー

columns = ', '.join('`{}`'.format(k) for k in data_dict) 

import MySQLdb 

def update_many(data_list=None, mysql_table=None): 
    """ 
    Updates a mysql table with the data provided. If the key is not unique, the 
    data will be inserted into the table. 

    The dictionaries must have all the same keys due to how the query is built. 

    Param: 
     data_list (List): 
      A list of dictionaries where the keys are the mysql table 
      column names, and the values are the update values 
     mysql_table (String): 
      The mysql table to be updated. 
    """ 

    # Connection and Cursor 
    conn = MySQLdb.connect('localhost', 'jeff', 'atwood', 'stackoverflow') 
    cur = conn.cursor() 

    query = "" 
    values = [] 

    for data_dict in data_list: 

     if not query: 
      columns = ', '.join('`{0}`'.format(k) for k in data_dict) 
      duplicates = ', '.join('{0}=VALUES({0})'.format(k) for k in data_dict) 
      place_holders = ', '.join('%s'.format(k) for k in data_dict) 
      query = "INSERT INTO {0} ({1}) VALUES ({2})".format(mysql_table, columns, place_holders) 
      query = "{0} ON DUPLICATE KEY UPDATE {1}".format(query, duplicates) 

     v = data_dict.values() 
     values.append(v) 

    try: 
     cur.executemany(query, values) 
    except MySQLdb.Error, e: 
     try: 
      print"MySQL Error [%d]: %s" % (e.args[0], e.args[1]) 
     except IndexError: 
      print "MySQL Error: %s" % str(e) 

     conn.rollback() 
     return False 

    conn.commit() 
    cur.close() 
    conn.close() 

説明はここでは使用の例です

column_list = [] 
for k in data_dict: 
    column_list.append(k) 
columns = ", ".join(columns) 

同じである

test_data_list = [] 
test_data_list.append({'id' : 1, 'name' : 'Marco', 'articles' : 1 }) 
test_data_list.append({'id' : 2, 'name' : 'Keshaw', 'articles' : 8 }) 
test_data_list.append({'id' : 3, 'name' : 'Wes', 'articles' : 0 }) 

update_many(data_list=test_data_list, mysql_table='writers') 

クエリ出力

INSERT INTO writers (`articles`, `id`, `name`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE articles=VALUES(articles), id=VALUES(id), name=VALUES(name) 

値出力

[[1, 1, 'Marco'], [8, 2, 'Keshaw'], [0, 3, 'Wes']] 
+0

ええ、Mysqlは一括更新をサポートしていません。 – keshaw

+0

上記のコードは一括更新を可能にします。 –

1

多分これは私がMySQLdbは一度に複数のUPDATEクエリを処理する方法を持っているとは思わない How to update multiple rows with single MySQL query in python?

cur.executemany("UPDATE Writers SET Name = %s WHERE Id = %s ", 
    [("new_value" , "3"),("new_value" , "6")]) 
conn.commit() 
+0

いいえ動作しません。それは更新のための挿入のためにのみ動作します – keshaw

+0

@userなぜそれは "動作していません"ですか?エラーは何ですか? –

+0

エラーはありません。また、更新していません。 – keshaw