みたぬメモ

地味にメモ

peeweeのupsert()について

DBに接続して値を登録するAPI作成に関する備忘録です。(たぶんあとで読みやすくなるよう適宜修正する可能性があります。)

言語はPythonで、DBはMySQLになります。

 

1. 背景

DBにbulk insert(まとめて一気にインサート)するとき、DB側にすでに登録されてある値が含まれているとエラーを返します。そのとき、他の新たに登録したい値も棄却されます。

peeweeのドキュメントによるとon_conflict()を用いることで、すでに登録されてある値を無視して他の値がバルクインサートされます。しかしon_conflict()はSQLiteにしか使えません。

 

2. 解決方法

MySQLの場合は、on_conflict()の代わりにupsert()が使えます。

bulk insertと組み合わせると、こんな具合になります。

 ModelName.insert_many(rows).upsert().execute() 

MySQL側でselectして確認すると、値がREPLACEされて登録されていることがわかります。

 

参考:

http://docs.peewee-orm.com/en/latest/peewee/api.html?highlight=conflict (公式ドキュメント)

python - How can I insert multiple rows with INSERT REPLACE in peewee? - Stack Overflow