Travail avec la base de données dans Drupal 7 - leçon 1 - API de base de données Drupal (db api)
Si vous avez écrit des modules pour la version 6 de Drupal, la transition vers la nouvelle API base de données de Drupal 7 ne sera pas difficile pour vous. La nouvelle API DB repose sur l’extension PHP PDO, ce qui lui permet de fonctionner avec différentes bases de données comme MySQL, PostgreSQL, MSSQL, et possiblement Oracle. Concernant la facilité, il est difficile de se prononcer ; il faut s’habituer à la nouvelle syntaxe, car écrire des requêtes SQL directement est souvent plus naturel.
Voici un extrait de la documentation officielle :
Drupal 7 Database API fournit un niveau d’abstraction standard et intuitif pour accéder au serveur de base de données. Cette API est conçue pour conserver la puissance et la syntaxe du SQL autant que possible, mais aussi :
- Supporte facilement plusieurs serveurs de base de données ;
- Permet aux développeurs de créer des fonctions avancées de base de données comme les transactions ;
- Fournit une interface structurée pour construire dynamiquement des requêtes ;
- Assure la sécurité et les bonnes pratiques de développement ;
- Donne aux modules une interface propre pour intercepter et modifier les requêtes du site ;
- La documentation principale de l’API base de données est directement intégrée dans les commentaires du code. La section Handbook est enrichie d’une documentation API pour les développeurs souhaitant travailler efficacement avec les bases de données, notamment sous l’angle administratif. Le Handbook ne couvre toutefois pas toutes les fonctionnalités de l’API.
- L’API base de données est conçue en programmation orientée objet (POO) et ce document suppose une connaissance minimale de ce paradigme. Toutefois, la plupart des opérations courantes ont une forme fonctionnelle et les développeurs peuvent choisir d’utiliser cette approche pour écrire leur code.
Concept principal de l’API base de données Drupal
Le niveau d’abstraction base de données (ou couche db) dans Drupal est construit sur la bibliothèque PHP PDO. PDO fournit une API orientée objet unifiée pour accéder à diverses bases de données, mais ne gère pas les différences syntaxiques SQL entre les serveurs.
Drivers
Étant donné que chaque type de base de données requiert une interaction spécifique, la couche db de Drupal exige un driver par type de base. Chaque driver est constitué d’une série de fichiers situés dans includes/database/driver
, où driver
est une chaîne unique identifiant ce driver. Dans la plupart des cas, le nom du driver correspond au nom de la base en minuscules, par exemple "mysql", "pgsql" ou "mycustomdriver".
Chaque driver contient plusieurs classes dérivées des classes parent dans le noyau Drupal. Ces classes peuvent redéfinir tout comportement nécessaire pour supporter correctement la base spécifique. Les classes du driver sont nommées en ajoutant un suffixe underscore suivi du nom du driver en minuscules. Par exemple, la version spécifique à MySQL de InsertQuery est nommée InsertQuery_mysql
.
Connexion à la base
Une connexion est un objet de la classe DatabaseConnection
, qui hérite de la classe PDO. Chaque base connectée dans Drupal possède une connexion unique et son objet associé. La classe de connexion peut être une sous-classe spécifique à chaque driver.
Pour accéder à un objet connexion :
<?php $conn = Database::getConnection($target, $key); ?>
Pour accéder à la connexion active actuelle :
<?php $conn = Database::getConnection(); ?>
La plupart du temps, vous n’aurez pas besoin d’interroger directement l’objet connexion. Une fonction enveloppante s’en chargera pour vous. La seule raison de le faire est si vous effectuez des requêtes complexes sur plusieurs bases et ne souhaitez pas changer la connexion active.
Pour définir la connexion active, utilisez :
<?php db_set_active($key); ?>
Requêtes à la base de données
Une requête est une expression SQL envoyée via la connexion. L’API Drupal supporte 6 types de requêtes : statiques (Static), dynamiques (Dynamic), insertions (Insert), mises à jour (Update), suppressions (Delete) et fusion (Merge). Certaines requêtes écrites en SQL peuvent remplacer le constructeur de requêtes orienté objet. L’objet requête fait référence au constructeur pour choisir le type.
Écriture d’une requête
Une déclaration d’objet résulte toujours d’une requête SELECT. Ce sera toujours un objet de type DatabaseStatement
ou une sous-classe. DatabaseStatement
étend PDOStatement.
Drupal utilise des déclarations préparées pour toutes les requêtes. Une déclaration préparée est un modèle de requête dans lequel les valeurs sont insérées lors de l’exécution. Elle est similaire à une requête SQL préparée avec paramètres, qui peut être réutilisée plusieurs fois.
Drupal ne dévoile pas directement la déclaration préparée. Le développeur utilise l’objet requête sans SQL direct, puis exécute la requête.