Web2py: il DAL


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.

About the Author

Carlo Bazzo
Carlo Bazzo è fondatore di Epysoft, una start up tecnologica con sede a Treviso e CTO di Hdemo Network Business Solutions. Puoi contattare Carlo Bazzo su Linkedin.

3 Comments on "Web2py: il DAL"

  1. Ciao Carlo,

    complimenti per il post,

    stavo valutando anche io web2py, non mi sembra veramente niente male, solo non riesco a capire 2 cose:

    1. Come posso intervenire nei callback del DAL (esempio tracciare le modifiche ad un record con before_update / after_save ecc., sembra che non esistano…)

    2. Come si fa a stampare qualcosa nel log a livello di controller / model ? Anche qui mi sembra di avere capito che l’unico log che esiste è quello relativo alle chiamate http…

    Per il resto il framework sembra veramente notevole…

  2. Ciao Tax,
    scusa se mi intrometto.
    1) Non lo puoi far a livello del DAL ma lo puoi fare a livello dei form the chiamo il DAL. Per esempio:
    form=crud.create(db.table,onvalidation=…,onaccept=…)
    2) http://groups.google.com/group/web2py/browse_thread/thread/3f81b4f9458695d5

  3. ciao Tex,
    come detto da Massimo, che ringrazio per l’intervento:

    1) non esiste la possibilità di avere funzioni di callback direttamente nel DAL ma è possibile avere qualcosa di molto vicino con il parametro onvalidation dei form (o SQLFORM o Crud) attraverso il quale può essere definita una funzione da eseguirsi subito dopo la validazione. D’altra parte non è comunque difficile scrivere un po’ di codice per gestirla autonomamente (abbiamo sviluppato qualcosa del genere in epysoft), anche se ovviamente dipende dal risultato che si vuole ottenere.
    2) su google groups se ne è parlato spesso ma il recente thread che Massimo segnala direi che dà la risposta definitiva.

Comments are closed.