[PYTHON] Wai "Django peut-il REJOINDRE?"

(Remarque) Cet article est en notation Wai. En ce qui concerne M. Yametaro @Yametaro.

Un jour ma maison

Wai "Je crée une application Django comme passe-temps Nyaga" Wai "Vous pouvez créer un tableau simplement en écrivant un modèle" Wai "Django a faim de créer un écran de gestion!"

DB normalisé

Wai "Facile à définir des clés externes" Wai "Par exemple, il est préférable de séparer le tableau des données du joueur et des résultats du joueur [^ 1]" [^ 1]: On dirait que vous n'en avez pas besoin si vous regardez seulement ici, mais je l'utilise ailleurs ...

Players

id year name position
1 2019 Tanaka lanceur
2 2019 Suzuki Premier but
3 2020 Takahashi Voltigeur
4 2020 Yamada joueur de deuxième but

FielderTotalResults

id player_id at_bat hit homerun Abréviation
1 1 4 1 1 ・ ・ ・
2 2 3 3 0 ・ ・ ・
3 3 5 2 1 ・ ・ ・
4 4 4 1 0 ・ ・ ・

Wai "Le player_id des résultats totaux du joueur de champ est une clé externe" Wai "Cela correspond à ʻid` dans la table des joueurs"

Wai "Dans cet exemple, FieldeTotalResults id 1 est Tanaka, et 2 records sont les notes de Suzuki." Wai "Il est clair que 3 est Takahashi et 4 est Yamada."

Je veux INNER JOIN

Wai "Le tableau des résultats totaux des joueurs de champ est le résultat du total des résultats pour chaque joueur." Wai "Je veux combiner le résultat avec les joueurs et l'afficher à l'écran."

year name position at_bat hit homerun Abréviation
2019 Tanaka lanceur 4 1 1 ・ ・ ・
2019 Suzuki Premier but 3 3 0 ・ ・ ・
2020 Takahashi Voltigeur 5 2 1 ・ ・ ・
2020 Yamada joueur de deuxième but 4 1 0 ・ ・ ・

Wai "Il ressemble à ceci dans l'image" Wai "Je me demande si je peux écrire de manière à ce que l''id des joueurs et l''id_lecteur des résultats totaux des joueurs correspondent." Wai "Par exemple, si vous souhaitez combiner les informations sur les joueurs et les notes de Suzuki"

from django.db import models
from eikan.models import Players, FielderTotalResults

p = Players.objects.get(pk=2)
f = FielderTotalResults.objects.get(player_id=p.id)

Wai "Hmm? C'est juste d'obtenir le même record de joueur à chaque table!" Wai "Je veux le combiner et le transmettre au modèle comme une seule donnée" Wai "Hmm, même si vous regardez le document officiel, il n'y a pas de description de JOIN." Wai "Dans un tel cas, est-ce que vous l'obtenez séparément et faites quelque chose avec Template?"

En fait, c'est déjà INNER JOIN

Fille (** 2 ans **) [^ 2] "Papa! Si tu as une table enfant avec Django" [^ 2]: il existe vraiment Fille "Je l'ai déjà acquis en étant INNER JOIN avec la table parent."

Wai "Quoi!?" Wai "(À l'âge de deux ans, je comprends déjà mieux Django que Wai ...!?)"

Wai "Ma fille, où savais-tu ça?" Fille "Je me souviens avoir joué avec mes amis à l'école maternelle"

Wai "(Peut-on jouer à l'école maternelle à Django ...?)" Wai "(Je ne savais pas parce que Wai est allé à la maternelle ...)"

Wai "Mais ma fille, es-tu vraiment connectée à la table des parents?" Wai "Si vous écrivez f.name" Wai "Ne fais pas ça, tu te fâches."

Fille "Si vous êtes papa, vous êtes une personne manuelle" Fille "Dans un tel cas, vous obtenez d'abord l'enregistrement de la table enfant, non?"

f = FielderTotalResults.objects.get(player_id=2)

Fille "Dans cet état, si vous écrivez" table enfant. Clé externe. Nom de colonne de la table parent ", vous pouvez obtenir la valeur."

f.player_id.name
>>>Suzuki

Wai "Honnêtement! (Manuel humain ...?)"

Fille "Si vous écrivez de la même manière avec Template" Fille "Vous pouvez utiliser les valeurs de colonne de la table parent sans avoir à passer la table parent." Fille "Si parents-> enfants-> petits-enfants ont une relation" Fille " table petit-fils. Clé externe enfant. Clé externe parent. Élément parent " Fille "Je peux écrire"

Wai "Wow ... c'est incroyable ..." Wai "Je ne peux rejoindre nulle part, mais Django peut facilement se joindre."

Fille "Papa n'est référencé par personne" Wai "Se, Sayana ..." Wai "(Quel enfant destructeur de 2 ans ...)"

** Ci-dessous, ajouté à la suite des commentaires **

Un autre jour

Wai "Enfin terminé!" Wai "J'ai été épargné pendant que je dormais, donc je n'ai pu dormir que 8 heures!"

Yome (je dors assez, non?)

Wai "Je vais le donner à Heroku avec un échantillon" Wai "Eh bien, contenu Je ne l'utilise pas sauf pour Wai!"

Fille "je l'ai fait" Fille "Je pense que c'est un gros problème" Fille "C'est de l'éducation"

Wai "Fat!?" Wai (Sous pression comme l'ancien directeur de l'équipe de baseball du Kansai ...!) Wai "Ma fille, penses-tu que la valeur de score n'est pas si élevée pour voler dans les temps modernes?"

Fille "Papa, parle de Django, pas de Sabermetrics." Fille "Peu importe combien vous pouvez obtenir dans l'état de INNER JOIN" Fille "Chaque fois que j'essaye d'utiliser la valeur dans le style d'écriture actuel" Fille "De nombreuses requêtes sont émises et cela devient très lourd" Fille "soi-disant problème N + 1" Fille "En fait, celle que papa a déployée à Heroku a également beaucoup de requêtes."

Wai "Je pensais que c'était lourd, mais je me demande si c'est comme ça ..." Wai "Comment saviez-vous que ma fille recevait beaucoup de questions?"

Fille "Quand j'utilise django-debug-toolbar, la requête émise sera affichée." Fille "Si vous google, vous pouvez facilement comprendre comment l'utiliser, donc je vais l'omettre." Fille "La requête émise par l'application de papa ressemble à ceci"

Nom de la page Nombre de requêtes temps de traitement(ms)
Équipe actuelle 48 959
Liste des équipes 7 115
Détails de l'équipe 324 4576
Liste des fielders 43 770
Liste des pichets 15 416
Détails du pichet 76 1426
Détails de la pâte 66 1261
Liste de match 29 453
Détails du match 20 345

Wai "Parce que les détails de l'équipe sont obtenus à partir de différentes tables." Wai "C'est vraiment lourd" Wai "Si ça devient plus léger, je suis désolé."

Fille "Si vous souhaitez obtenir et traiter des enregistrements liés à divers endroits" Fille "comme c'était un commentaire" Fille "En utilisant select_related (), vous pouvez arrêter d'émettre des requêtes inutiles"

f = FielderTotalResults.objects.select_related('player_id').get(player_id=2)
f.player_id.name
>>>Suzuki

Fille "C'est comme ça comme façon d'écrire" Fille "En faisant cela, peu importe combien de fois vous utilisez f.player_id.name" Fille "La requête n'est émise qu'une seule fois"

Wai "Wow ... c'est incroyable ..." Wai "Alors je réglerai tout ce qui s'applique pour le moment"

n semaines plus tard

Wai "Ça devient plus léger!" Wai "C'est assez efficace juste d'utiliser select_related ()" Wai "Vérifier avec django-debug-toolbar" Wai "Facile à revoir le traitement global" Wai "C'est le résultat d'une refonte majeure."

Nom de la page Nombre de requêtes(Avant) Nombre de requêtes(arrière) temps de traitement(Avant)(ms) temps de traitement(arrière)(ms)
Équipe actuelle 48 7 959 183
Liste des équipes 7 3 115 75
Détails de l'équipe 324 15 4576 110
Liste des fielders 43 3 770 92
Détails de la pâte 66 6 1261 212
Liste des pichets 15 3 416 71
Détails du pichet 76 12 1426 137
Liste de match 29 3 453 1
Détails du match 20 6 345 2

Wai "Je l'ai corrigé pour ne pas émettre de requêtes autant que possible." Wai "Peu importe où vous l'affichez, c'est croustillant!" Wai "C'est évident quand on le compare!" Wai "Et même si vous ajoutez plus de données" Wai "Le nombre de requêtes n'a pas beaucoup augmenté." Wai "Si vous êtes curieux, veuillez le toucher et le comparer ~"

Lourd: https://trial-endb-v1.herokuapp.com/ Briquet: https://trial-endb-v2.herokuapp.com/

Dans le bain

Wai «Wai lui-même a été impressionné par cette fonction, j'ai donc écrit cet article. Wai "Si vous trouvez ce post de teratail, vous pouvez lire cet article pendant longtemps." Wai "J'ai parlé de le résoudre bientôt" Wai "Cet article peut être bruyant pour de nombreuses personnes."

Fille "papa" Fille "Pensez-vous que les articles qui complètent la réponse de Teratail aideront également quelqu'un?" Fille "Et en écrivant en notation Wai comme ça" Fille "En revivant le succès après l'échec" Fille "Cela prendra racine dans la mémoire de tous" Fille "En fait, obtenez un commentaire et essayez-le" Fille "L'avez-vous compris en comparant?"

Wai "Seyana" Wai "Wai lui-même peut ne pas ressentir les avantages même s'il dit soudainement la meilleure pratique," C'est mieux! " Wai "J'espère que quelqu'un lit cet article et s'en sent bien." Fille "Ummami!"

Wai "Puis-je manger de la glace quand je sors du bain?" Fille "Wow mange!"

Wai "(j'ai été en train de trottiner jusqu'à cette fois)" Wai "(Parle-moi de l'enfant qui porte ça)"

** ~ ~ (pas de punch ou yama) C'est fini ~ ~ **

Github https://github.com/shimayu22/Eikan-Database

référence

Jointures de table que même les amateurs de SQL peuvent comprendre (jointure interne et jointure externe) Résumé des opérations de la base de données Django Lorsque j'ai vérifié la requête générée par Django, elle a été émise en grand nombre [Django] Ingéniosité pour réduire le nombre de requêtes (sera ajoutée à tout moment) Django Reverse Pull Cheet Sheet (Query Set) [Django 2.2] Comment affichez-vous la destination de la relation dans Django? [Vue liste] Rechercher la table des petits-enfants avec Django Comment trouver et éradiquer les problèmes N + 1 lors du développement sur Django

Recommended Posts

Wai "Django peut-il REJOINDRE?"
Que fait le rendu de Django
Faites Django avec CodeStar (Python3.6.8, Django2.2.9)
Faites Django avec CodeStar (Python3.8, Django2.1.15)
Effectuer le cryptage AES avec DJango
Jointure externe gauche dans le modèle Django
Python | Ce que vous pouvez faire avec Python