J'ai parfois envisagé d'émettre une requête brute Django.
Par exemple, lorsque vous souhaitez utiliser le résultat calculé en fonction de la colonne au lieu de spécifier la colonne dans SELECT ou WHERE.
J'avais des ennuis comme ça.
--Il n'y a pas de générateur de requêtes! ―― On dirait que c'est dans le plug-in! ――Mais PostgreSQL le prend-il en charge? → J'utilise MySQL!
Ah, l'objet ORM a une méthode brute ... eh bien,
entities = Entity.objects.raw("SELECT concat_ws(',', id, name) AS mystr FROM entities WHERE name IN %s", params=(list(names),))
C'est OK? Mais la liste spécifiée dans IN ne passe pas. Hmm,
https://docs.djangoproject.com/ja/1.9/ref/models/expressions/#raw-sql-expressions
Mais ça ne marche pas ...
Alors, quand j'ai cherché un peu plus, j'ai trouvé quelque chose comme ça.
https://docs.djangoproject.com/ja/1.9/ref/models/querysets/#django.db.models.query.QuerySet.extra
Avec ça,
entities = Entity.objects.extra(
select={'mystr': "concat_ws(',', id, name)"},
where=['name IN %s'],
params=[list(names)]
)
J'ai l'impression de pouvoir écrire un peu mieux que brut.
Cependant ...!
Use this method as a last resort
This is an old API that we aim to deprecate at some point in the future. Use it only if you cannot express your query using other queryset methods.
Parce qu'il y en a, il vaut peut-être mieux ne pas l'utiliser ...
https://docs.djangoproject.com/ja/1.9/ref/models/expressions/#raw-sql-expressions
Il est préférable d'utiliser
Recommended Posts