私は何百万という行をMySQLに更新する必要があります。私は現在、クエリを実行するためにループを使用しています。アップデートを速くするために、Python MySQL Connectorのexecutemany()
を使いたいので、バッチごとに単一のクエリを使ってバッチを更新することができます。Pythonで一括更新MySql
1
A
答えて
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()
関連する問題
- 1. Python Peewee MySQL一括更新
- 2. php mysql一括レコード更新?
- 3. MYSQLの一括更新
- 4. mysql一括レコードの更新?
- 5. Mysqlの一括更新クエリ
- 6. Mysqlのデータベーステーブルデータの一括更新
- 7. 一括更新MySQLのテーブルは
- 8. PL/SQL一括バインド/一括更新文
- 9. 一括更新RavenDB
- 10. SQLでの一括更新
- 11. Oracle12cでの一括更新
- 12. Neo4jデータの一括更新
- 13. Railsの5一括更新
- 14. 一括データ更新SQL Server
- 15. エンティティフレームワークコア(7)一括更新
- 16. Lodashコレクション一括更新
- 17. 一括更新スクリプトのテスト
- 18. DynamoDBの一括更新
- 19. Elasticsearch PHP API一括更新
- 20. 一括更新のシンプルプロダクト "status"(MySQLクエリ経由)
- 21. 既存のMySQLデータの一括更新パフォーマンスを最適化
- 22. MapReduceでデータストアを一括更新する
- 23. Djangoで '一括更新'するには?
- 24. ElasticSearch一括更新:Pythonスクリプトを使用したJSONの整理
- 25. Sqlite3 Python:効率的な一括更新を行うには?
- 26. belongs_toモデルから一括更新has_manyリレーションシップモデル
- 27. Android - contentresolverの一括更新の方法
- 28. SQLAlchemy一括更新の戦略
- 29. カーソルのないトリガー一括更新
- 30. スマートシートAPI一括更新複数シート
ニース..しかし、私は質問を見ていませんか? – Marco
基本的に私はpythonでの更新のためにexecutemanyを使用したいと思います。出来ますか ? – keshaw
私はそうは思わない – Marco