

Python Django の モデルマネージャを使って、MySQL のバルクREPLACE を実行する方法をご存知であれば教えてください。

[code]

    class SpamModel(models.Model):
        ...
    
    SpamModel.objects.bulk_create([
        SpamModel(**item) for item in items])
    
[/code]

このようにバルクインサートを行っていますが、ここで INSERT ではなく REPLACE をしたいのです。

このようなイメージです。

[code]

    SpamModel.objects.bulk_create([
        SpamModel(**item) for item in items], mysql_replace=True)
    
[/code]

こんなコードでできないものかと。

[code]

    REPLACE INTO spam_spammodel (a, b) VALUES (...), (...), (...), ...
    
[/code]

このようなSQLが出ることを想定しています

※ UPSERT ではありません。また、DELETE してからの INSERT でもありません。あくまで、MySQL の REPLACE
文での実行をしたいのです。


CC BY-SA 3.0
2015-06-05T02:08:36.960
10990
2015-08-07T01:54:01.210
10001
question
python mysql django
Django で、バルクREPLACE をする方法が知りたい


目的は、SpamModel.somefieldで"X"の場合、"z"に変えるなら、`.update()`が使えるかと思います：

[code]

    SpamModel.objects.filter(somefield='x').update(somefield='z')
    
[/code]

> REPLACE works exactly like INSERT, except that if an old row in the  
>  table has the same value as a new row for a PRIMARY KEY or a UNIQUE  
>  index, the old row is deleted before the new row is inserted.
>
> **Note:**  
>  _REPLACE makes sense only if a table has a PRIMARY KEY or UNIQUE  
>  index. Otherwise, it becomes equivalent to INSERT, because there is no  
>  index to be used to determine whether a new row duplicates another._

<https://dev.mysql.com/doc/refman/5.0/en/replace.html>

ならば、Djangoで実現したいなら、DELETE してからの INSERT
になると思います。なければ、自分で[SQL文を発行する](https://docs.djangoproject.com/en/1.8/topics/db/sql/#executing-
custom-sql-directly)しかないでしょうか？

<https://docs.djangoproject.com/en/1.8/topics/db/sql/#executing-custom-sql-
directly>


CC BY-SA 3.0
2015-06-08T00:33:09.583
11086
2015-06-08T00:33:09.583
2314
10990
answer