[PYTHON] Model.objects.extra à prendre en compte avant d'utiliser du SQL brut avec Django

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

Model.objects.extra à prendre en compte avant d'utiliser du SQL brut avec Django
Étapes pour développer Django avec VSCode
Standardiser le HTML à louer avec Django
Comment démarrer avec Django
[Django 2.2] Ajouter un nouveau badge aux nouveaux messages avec une date à l'aide d'un filtre de modèle
Comment effectuer un traitement arithmétique avec le modèle Django
Notes d'étape pour démarrer avec django
Développement d'applications à l'aide de SQLite avec Django (PTVS)
Exécuter du SQL brut avec redash à l'aide de la source de données Python et afficher le résultat
Essayez de créer un site de gestion Todo en utilisant WebSocket avec Django (Swamp Dragon)
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 2: importer des données dans SQL Server à l'aide de PowerShell
Le moyen le plus simple de démarrer avec Django
Essayez d'utiliser django-import-export pour ajouter des données csv à django
Comment développer une application de panier avec Django
[Django] Comment obtenir des données en spécifiant SQL.
Comment implémenter "named_scope" de RubyOnRails avec Django
Télécharger des images sur S3 avec une interface graphique à l'aide de tkinter