Conseils d'optimisation ORM dans le framework Django

PHPz
Libérer: 2023-06-17 11:57:58
original
1237 Les gens l'ont consulté

Django est un framework Web Python populaire, et sa fonction ORM (Object-Relational Mapping) a été largement utilisée dans le développement Web, permettant aux développeurs d'opérer via des objets Python sans exploiter directement la base de données. Cependant, à mesure que le volume de données augmente, les performances de l'ORM peuvent en souffrir. Par conséquent, dans cet article, nous présenterons quelques conseils d’optimisation de Django ORM pour améliorer les performances de votre application.

  1. Utilisez .select_rated()

La méthode .select_rated() dans Django ORM peut précharger les données de tous les objets associés, évitant ainsi plusieurs requêtes vers la base de données. Par défaut, lors de l'interrogation de la base de données à l'aide de l'ORM, Django récupère uniquement les données du modèle principal. Si le modèle possède une ou plusieurs clés étrangères, nous pouvons obtenir tous les objets de clé étrangère via .select_rated(). Par exemple,

books = Book.objects.select_related('publisher').all()
Copier après la connexion

Dans le code ci-dessus, le modèle Books a un éditeur de clé étrangère En sélectionnant le modèle d'éditeur associé, nous pouvons obtenir toutes les données associées en une seule requête. Cela évite les accès répétés à la base de données lors des requêtes ultérieures et améliore les performances.

  1. Utilisez .prefetch_rated()

Semblable à .select_rated(), la méthode .prefetch_rated() peut également précharger les données du modèle spécifié en mémoire pour éviter plusieurs requêtes de base de données. La différence est que la méthode .prefetch_rated() est utilisée pour l'accès entre plusieurs-à-plusieurs, une association inverse et d'autres modèles, par exemple :

publishers = Publisher.objects.prefetch_related('books').all()
Copier après la connexion

Dans le code ci-dessus, le modèle Publisher a une association inverse de livres, et .prefetch_rated () peut être utilisé une fois. Obtenez tous les éditeurs à la fois, évitant ainsi la surcharge de plusieurs requêtes de base de données.

  1. Utilisez .values() et .values_list()

Les méthodes .values() et .values_list() dans Django ORM peuvent être utilisées pour collecter les données du modèle spécifié dans une liste, réduisant ainsi le nombre de requêtes à la base de données. Par exemple,

authors = Author.objects.all().values('name', 'email')
Copier après la connexion

Dans le code ci-dessus, nous n'avons besoin que du nom et de l'adresse e-mail de l'auteur, et d'utiliser la méthode .values() pour obtenir les résultats en une seule fois.

  1. Remplacer la requête en boucle

Dans Django ORM, la méthode d'obtention de plusieurs données via une requête en boucle peut provoquer des goulots d'étranglement en termes de performances. Par exemple, le code suivant provoquera de nombreuses requêtes de base de données :

for author in Author.objects.all():
    books = author.books.all()
    # do something with the books
Copier après la connexion

En revanche, nous pouvons utiliser la méthode .prefetch_rated() pour remplacer les requêtes en boucle afin de réduire les requêtes de base de données :

authors = Author.objects.prefetch_related('books')
for author in authors:
    # get books from prefetched related
    books = author.books.all()
    # do something with the books
Copier après la connexion

Dans le code ci-dessus, nous utilisons .prefetch_rated () méthode pour précharger les données de l'auteur du livre afin de réduire le nombre d'accès à la base de données.

  1. Utiliser les index de base de données

Django ORM prend en charge l'utilisation des index de base de données pour accélérer les requêtes. Les index peuvent trier les données de la base de données en fonction de colonnes spécifiées, ce qui rend le processus de requête plus efficace. Dans Django, nous pouvons utiliser la classe Meta du modèle pour définir des index, par exemple :

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    class Meta:
        indexes = [
            models.Index(fields=['title'], name='title_index'),
            models.Index(fields=['author'], name='author_index'),
        ]
Copier après la connexion

Dans le code ci-dessus, nous définissons deux index à interroger en fonction des colonnes titre et auteur.

  1. Pool de connexion à la base de données

Dans Django ORM, la connexion à la base de données est une ressource coûteuse. Par conséquent, nous pouvons utiliser le pool de connexions à la base de données pour maintenir un ensemble de connexions afin de réduire la surcharge des connexions à la base de données. Pour les applications Django, vous pouvez utiliser le module Django-dbconn-reuse pour implémenter le pooling de connexions à la base de données. Après l'installation, il vous suffit d'ajouter le code suivant au fichier settings.py de Django pour activer le pool de connexions :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'conn_max_age': 60,
            'charset': 'utf8mb4',
            'pool_size': 5
        }
    }
}
Copier après la connexion

Dans le code ci-dessus, nous avons utilisé la base de données MySQL et défini la taille du pool de connexions à 5 connexions.

Conclusion

Dans les applications Django, ORM est une fonctionnalité très puissante qui peut grandement simplifier le processus d'interaction entre l'application et la base de données. L'utilisation des conseils et des optimisations ci-dessus pour améliorer les performances de votre ORM peut nous aider à mieux tirer parti de cette fonctionnalité puissante pour améliorer les performances et la fiabilité des applications.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal