Web2py, come tutti i framework più diffusi, ha un layer di astrazione verso i database relazionali cui si interfaccia, il DAL (Database Abstraction Layer). A questi layer ci si riferisce spesso anche con il termine di ORM (Object Relational Mapping): anche se in teoria i due concetti non sono la stessa cosa, quasi sempre un DAL è di fatto una interfaccia ad oggetti verso il mondo relazionale dei database. Mentre il concetto di ORM si collega strettamente ai database ad oggetti o quantomeno ad un linguaggio di interrogazione ad oggetti contrapposti alla logica relazionale imperante nei database attuali, un DAL risponde più praticamente a due croniche esigenze avvertite nella programmazione di applicazioni web oriented: da un lato i problemi di sicurezza derivanti dalla SQL Injection (modifiche delle stringhe SQL a fini maligni), dall’altro la necessità di avere un “linguaggio” univoco per il dialogo con le diverse basi di dati a prescindere dal motore RDBMS sottostante.
Per quanto attiene alla prima esigenza, gli script che utilizzino un DAL non eseguono mai direttamente codice SQL ma questo verrà invece dinamicamente generato dal DAL: esso si incaricherà di tradurre il codice “proprietario” del DAL nel dialetto SQL specifico del database scelto come base dati.
Per la seconda esigenza, il DAL funge da interfaccia unica con il suo linguaggio specifico verso qualunque database sottostante. In questo modo vengono risolti due classi di problemi tipici: le differenze tra i vari dialetti SQL che costringevano il programmatore ad una continua documentazione al variare del database (a questo si aggiungono poi le peculiarità di ogni singolo driver, specifico per ciascun database, pur se appartenenti allo standard db-api 2) e la migrazione di una applicazione da un database all’altro.
A tutto questo risponde anche il DAL integrato in Web2py (che pure permette comunque l’utilizzo del classico SQL): esso genera SQL verso SQLite, MySQL, PostgreSQL, MSSQL, Firebird, Oracle e DB2; a questi si aggiunge anche la recente possibilità di lettura e scrittura verso il database Google BigTable, presente nell’ambiente Google Application Engine.
A dire il vero, sono sempre stato abbastanza scettico nei confronti dei vari ORM o DAL che dir si voglia sulla base della semplice asserzione “perchè sostituire un linguaggio flessibile, potente e auto esplicativo come SQL con una nuova e spesso astrusa sintassi?”. La mia opinione è mutata dopo aver utilizzato per qualche tempo il DAL di Web2py: ho trovato la sua sintassi abbastanza intuitiva anche per un “orso” come me e sufficientemente pythonica, tale da non fare rimpiangere nel 99% dei casi pratici il buon vecchio SQL; a questo si devono aggiungere i vantaggi generali sopra elencati per cui, ad esempio, portare una applicazione Web2py da SQLite a MySQL diventa una semplice questione di cambiare la stringa di connessione al database.
Vediamo alcuni esempi che illustrino la sintassi del DAL di Web2py, limitandoci a dei semplici cenni che poi magari approfondiremo nei prossimi articoli dove affronteremo la scrittura di una applicazione di esempio.

La connessione ad esempio ad un database SQLite si ottiene con:
db=DAL(’sqlite://miodatabase.db’)

La creazione di una tabella con la definizione di un unico campo ‘campo1′ che di default è di tipo stringa:
db.define_table(‘miatabella’,Field(‘campo1′))

DAL Rows è l’oggetto restituito da un SELECT SQL:
rows=db(db.miatabella.campo1 !=None).select()

DAL Query è l’oggetto restituito dalla clausola SQL WHERE:
miaquery=(db.miatabella.campo1 !=None) & (db.miatabella.campo1 > ‘B’)

DAL Set è l’oggetto che rapresenta un insieme di records risultanti da una query:
records=db(miaquery)
rows=records.select()
records.update(campo1=’Carlo’)

Vedremo meglio nei prossimi articoli come sia abbastanza intuitivo interrogare il database attraverso il DAL.