Développement avec Django : Utilisation de l'ORM vs Utilisation sans ORM
01 juil. 2024
Table des matières:
l’utilisation de Django sans ORM
Sans l’utilisation de l’ORM (Object-Relational Mapping), Django serait une structure de développement web qui nécessiterait l’écriture directe de requêtes SQL pour interagir avec la base de données. Cela signifie que chaque interaction avec la base de données nécessiterait la création manuelle de requêtes SQL, l’exécution de ces requêtes, la gestion des résultats et la transformation des données récupérées en objets Python utilisables dans l’application.
- Voici comment Django ressemblerait sans l’utilisation de l’ORM :
Structure de Code
- Définition des Modèles : Sans ORM, les modèles de données ne seraient pas des classes Python étendant django.db.models.Model. Au lieu de cela, les tables de base de données devraient être créées manuellement avec du SQL pur, et chaque interaction avec ces tables nécessiterait l’utilisation de requêtes SQL directes dans le code.
Exemple de définition de modèle sans ORM :
# Exemple sans ORM Django (utilisant SQL pur)class Author: def __init__(self, id, name, email): self.id = id self.name = name self.email = email class Article: def __init__(self, id, title, content, author_id, published): self.id = id self.title = title self.content = content self.author_id = author_id self.published = published
- Interactions avec la Base de Données :
Sans ORM, chaque opération CRUD (Create, Read, Update, Delete) nécessiterait l’écriture et l’exécution de requêtes SQL directes. Par exemple, pour créer un nouvel article, il faudrait construire et exécuter une requête INSERT SQL, puis gérer manuellement les résultats retournés pour les transformer en objets Python utilisables dans l’application.
Exemple d’interaction avec la base de données sans ORM :
# Exemple sans ORM Django (utilisant SQL pur)import psycopg2 # Exemple avec PostgreSQL # Connexion à la base de donnéesconn = psycopg2.connect("dbname=mydatabase user=myuser password=mypassword") # Création d'un nouvel articledef create_article(title, content, author_id, published): cur = conn.cursor() cur.execute( "INSERT INTO articles (title, content, author_id, published) VALUES (%s, %s, %s, %s)", (title, content, author_id, published) ) conn.commit() cur.close() # Récupération des articles publiésdef get_published_articles(): cur = conn.cursor() cur.execute("SELECT * FROM articles WHERE published = True") rows = cur.fetchall() articles = [] for row in rows: article = Article(row[0], row[1], row[2], row[3], row[4]) articles.append(article) cur.close() return articles # Fermeture de la connexionconn.close()
Difficultés et Limitations Complexité et Maintenance : Écrire du SQL directement dans le code augmente la complexité et rend le code plus difficile à maintenir. Les développeurs doivent gérer manuellement les détails de la syntaxe SQL et s’assurer que les requêtes sont correctement formées.
Portabilité : L’utilisation directe de SQL rendrait l’application moins portable entre différents systèmes de gestion de base de données, car chaque système a sa propre syntaxe SQL et ses particularités.
Sécurité : Sans l’abstraction fournie par l’ORM, les développeurs doivent être très prudents pour éviter les failles de sécurité comme les injections SQL, en validant et en échappant correctement les données utilisateur.
l’utilisation de Django ORM
- Voici comment Django ressemblerait avec l’utilisation d’ORM :
L’ORM Django simplifie la manipulation des données en permettant aux développeurs d’interagir avec la base de données à l’aide d’objets Python et de méthodes de requête abstraites. Voici comment vous pourriez définir des modèles et interagir avec la base de données en utilisant l’ORM Django :
Définition des Modèles Les modèles Django sont des classes Python qui définissent la structure des données de votre application. Chaque attribut de classe correspond à un champ de base de données, facilitant ainsi la création, la lecture, la mise à jour et la suppression des données.
from django.db import models class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() author = models.ForeignKey('Author', on_delete=models.CASCADE) published = models.BooleanField(default=False) class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField()
Interactions avec la Base de Données (CRUD)
Utilisation de l’ORM pour créer, lire, mettre à jour et supprimer des articles :
# Création d'un nouvel articlenew_article = Article.objects.create( title='Nouvel article avec ORM', content='Contenu de l\'article', author_id=1, published=True) # Lecture des articles publiésarticles = Article.objects.filter(published=True) # Mise à jour d'un articlearticle = Article.objects.get(id=1)article.content = 'Nouveau contenu de l\'article avec ORM'article.save() # Suppression d'un articlearticle = Article.objects.get(id=1)article.delete()
Avantages de l’ORM : L’ORM de Django facilite l’interaction avec la base de données en utilisant des classes Python pour représenter des tables de base de données, des objets pour représenter des lignes de table, et des méthodes pour effectuer des opérations CRUD (Create, Read, Update, Delete).
Structure des requêtes : Django fournit une API riche pour structurer les requêtes en utilisant des méthodes de gestion de requêtes telles que .filter(), .exclude(), .annotate(), etc.
Optimisation des requêtes : Utilisez des techniques comme select_related(), prefetch_related(), only(), defer() pour optimiser les performances des requêtes en minimisant le nombre de requêtes SQL générées et en limitant les données récupérées.
CONCLUSION
L’utilisation de l’ORM Django simplifie considérablement le développement en automatisant la génération de requêtes SQL, en offrant une interface orientée objet intuitive, et en facilitant la gestion des relations entre les modèles. Cependant, elle peut ajouter une légère surcharge de performance par rapport à l’écriture directe de SQL, surtout pour des opérations simples et directes.
En revanche, l’écriture directe de requêtes SQL offre plus de contrôle sur les détails d’implémentation et peut être plus performante dans certains cas spécifiques, mais elle nécessite une expertise SQL avancée et peut rendre le code plus difficile à maintenir.
Partager cet article:
Coach à Bakeli School of Technology