Lavorare con il database in Drupal 7 – Lezione 1 – Drupal Database API
Se hai già sviluppato moduli per la versione 6 di Drupal, non ti sarà difficile passare al nuovo Database API di Drupal 7. Il nuovo DB API si basa sull’estensione PHP PDO, il che gli consente di funzionare con diversi tipi di database come MySQL, PostgreSQL, MSSQL e persino Oracle. In termini di semplicità, serve un po’ di pratica per abituarsi alla nuova sintassi, poiché scrivere query SQL tradizionali può sembrare più familiare.
Ecco un estratto da quanto riportato nella documentazione ufficiale:
Drupal 7 Database API fornisce un livello di astrazione standard e intuitivo per accedere ai server di database. Questo API è stato progettato per mantenere il più possibile la sintassi e la potenza dell’SQL, ma allo stesso tempo:
- Supporta facilmente più server di database;
- Permette agli sviluppatori di creare funzionalità complesse come le transazioni;
- Offre un’interfaccia strutturata per costruire query dinamiche;
- Garantisce sicurezza e buone pratiche nello sviluppo;
- Fornisce ai moduli un’interfaccia pulita per intercettare e modificare le query del sito;
- La documentazione principale del Database API è inclusa direttamente nei commenti del codice. Il manuale (“handbook”) fornisce una panoramica introduttiva per gli sviluppatori di moduli che desiderano lavorare con i database in modo efficiente dal punto di vista amministrativo, ma potrebbe non coprire tutte le funzionalità dell’API.
- Il Database API è stato progettato con un approccio orientato agli oggetti, quindi si presume una conoscenza almeno parziale della programmazione OOP. Tuttavia, la maggior parte delle operazioni comuni dispone anche di un’interfaccia procedurale, permettendo agli sviluppatori di scegliere lo stile che preferiscono.
Concetto principale del Drupal Database API
Il livello di astrazione del database (o db layer) in Drupal si basa sulla libreria PHP PDO. PDO fornisce un’API unificata e orientata agli oggetti per accedere a vari tipi di database, ma non offre un’astrazione completa per le differenze di dialetto SQL tra i vari sistemi.
Driver
Poiché ogni database richiede modalità di interazione diverse, il livello DB di Drupal necessita di un driver specifico per ogni tipo di database. Ogni driver è costituito da una serie di file situati nella cartella includes/database/driver
, dove driver è una stringa che rappresenta la chiave univoca del driver. Nella maggior parte dei casi, la chiave coincide con il nome del database in minuscolo, come “mysql”, “pgsql” o “mycustomdriver”.
Ogni driver è composto da diverse classi derivate dalle classi base del core di Drupal. Queste classi possono ridefinire qualsiasi comportamento necessario per il corretto supporto del database. I nomi delle classi dei driver seguono una convenzione: il nome della classe base seguito da un underscore e dal nome del driver in minuscolo. Ad esempio, per MySQL, la versione specifica della classe InsertQuery
sarà InsertQuery_mysql
.
Connessione al database
Una connessione è rappresentata da un oggetto della classe DatabaseConnection, che estende la classe PDO. Ogni database a cui Drupal si connette ha una singola connessione e il relativo oggetto associato. La classe di connessione può avere sottoclassi specifiche per ciascun driver.
Per accedere all’oggetto della connessione, si può utilizzare:
<?php $conn = Database::getConnection($target, $key); ?>
Per accedere alla connessione attiva corrente:
<?php $conn = Database::getConnection(); ?>
Questo ti darà accesso alla connessione attiva del database.
Nella maggior parte dei casi, non sarà necessario richiamare direttamente l’oggetto di connessione, poiché le funzioni di alto livello lo fanno automaticamente. L’unico motivo per accedervi manualmente è quando si eseguono query complesse su più database senza voler modificare la connessione attiva.
Per impostare una connessione attiva diversa, usa:
<?php db_set_active($key); ?>
Query al database
Una query è un’istruzione SQL inviata tramite la connessione al database. Il Database API di Drupal supporta sei tipi di query: Statiche (Static), Dinamiche (Dynamic), Inserimento (Insert), Aggiornamento (Update), Eliminazione (Delete) e Unione (Merge). Alcune query possono essere scritte come stringhe SQL dirette, mentre altre vengono create tramite l’approccio orientato agli oggetti con il query builder.
Scrittura di una query
Un oggetto di query viene dichiarato come risultato di una query SELECT. Sarà sempre un oggetto della classe DatabaseStatement
o di una sua sottoclasse. DatabaseStatement
estende la classe PDOStatement
.
Drupal utilizza prepared statements (istruzioni preparate) per tutte le query. Una query preparata è un modello SQL in cui i valori vengono inseriti solo al momento dell’esecuzione. Questo approccio aumenta la sicurezza e l’efficienza, consentendo di riutilizzare la query con diversi parametri. In PDO, una query preparata viene compilata una volta e poi eseguita più volte con diversi valori. In pratica, “istruzione” e “risultato” diventano sinonimi, ma solo dopo che la query è stata eseguita.
Drupal non espone direttamente l’oggetto della query preparata. Invece, lo sviluppatore interagisce con un oggetto che rappresenta la query in forma astratta (senza SQL esplicito) e che viene compilato ed eseguito automaticamente al momento opportuno.