peeweeのupsert()について
DBに接続して値を登録するAPI作成に関する備忘録です。(たぶんあとで読みやすくなるよう適宜修正する可能性があります。)
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