Web2py - Livello di astrazione del database

Il Database Abstraction Layer (DAL)è considerato il principale punto di forza di web2py. Il DAL espone una semplice API (Applications Programming Interface) alla sintassi SQL sottostante.

In questo capitolo, conosceremo le applicazioni non banali di DAL, come la creazione di query per cercare in base ai tag in modo efficiente e la costruzione di un albero di categorie gerarchico.

Alcune caratteristiche importanti di DAL sono:

  • web2py include un Database Abstraction Layer (DAL), un'API che mappa gli oggetti Python in oggetti di database. Gli oggetti del database possono essere query, tabelle e record.

  • Il DAL genera dinamicamente l'SQL in tempo reale utilizzando il dialetto specificato per il back-end del database, in modo che non sia obbligatorio per uno sviluppatore scrivere una query SQL completa.

  • Il vantaggio principale dell'utilizzo di DAL è che le applicazioni saranno portabili con diversi tipi di database.

Guida introduttiva a DAL

La maggior parte delle applicazioni in web2py richiedono una connessione al database. Pertanto, la creazione del modello di database è il primo passo nella progettazione di un'applicazione.

Considera l'applicazione appena creata denominata “helloWorld”. Il database è implementato nei modelli dell'applicazione. Tutti i modelli per la rispettiva applicazione sono contenuti nel file denominato -models/db_custom.py.

I seguenti passaggi vengono utilizzati per implementare DAL:

Passaggio 1: DAL Constructor

Stabilisci una connessione al database. Questo viene creato utilizzando l'oggetto DAL che è anche chiamato il costruttore DAL.

db = DAL ('sqlite://storage.sqlite')

La caratteristica notevole di DAL è che consente più connessioni con lo stesso database o con database diversi, anche con diversi tipi di database. Si osserva che questa riga è già nel filemodels/db.py. Pertanto, potrebbe non essere necessario, a meno che non sia stato eliminato o sia necessario connettersi a un database diverso. Per impostazione predefinita, web2py si connette a un database SQLite archiviato in filestorage.sqlite.

Questo file si trova nella cartella dei database dell'applicazione. Se il file è assente, viene creato da web2py quando l'applicazione viene eseguita per la prima volta.

SQLite è veloce e memorizza tutti i dati in un unico file. Ciò significa che i tuoi dati possono essere facilmente trasferiti da un'applicazione all'altra. Infatti, i database SQLite sono confezionati da web2py insieme alle applicazioni. Fornisce supporto SQL completo, comprese traduzioni, join e aggregazioni.

Ci sono due svantaggi di SQLite.

  • Uno è che non applica i tipi di colonna e non c'è ALTER TABLE tranne per l'aggiunta e l'eliminazione di colonne.

  • L'altro svantaggio è che l'intero database è bloccato da qualsiasi transazione che richiede l'accesso in scrittura.

Passaggio 2 - Costruttore di tabelle

Una volta stabilita la connessione con il database, possiamo utilizzare il file define_table metodo per definire nuove tabelle.

Ad esempio:

db.define_table('invoice',Field('name'))

Il metodo sopra viene utilizzato anche tra il costruttore di tabelle. La sintassi per il costruttore di tabelle è la stessa. Il primo argomento è il nome della tabella ed è seguito da un elenco di fileField(s). Il costruttore del campo accetta i seguenti argomenti:

Suor n Argomenti e utilizzo
1

The field name

Nome del campo nella tabella.

2

The field type

accetta valori con uno qualsiasi dei tipi di dati come stringa (predefinito), testo, booleano, intero e così via.

3

Length

Definisce la lunghezza massima.

4

default = None

Questo è il valore predefinito quando viene inserito un nuovo record.

5

update = None

Funziona come l'impostazione predefinita, ma il valore viene utilizzato solo durante l'aggiornamento, non durante l'inserimento.

6

Notnull

Specifica se il valore del campo può essere NULL o meno.

7

readable = True

Questo specifica se il campo è leggibile nei moduli o meno.

8

writable = True

Specifica se il campo è scrivibile o meno nei moduli.

9

label = "Field Name"

Questa è l'etichetta da utilizzare per questo campo nei moduli.

Il define_table il metodo accetta anche tre argomenti con nome:

Sintassi

db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
  • migrate = True - Questo indica a web2py di creare la tabella se non esiste, o di modificarla se non corrisponde alla definizione del modello.

  • fake_migrate = False - Se il modello corrisponde al contenuto della tabella del database, imposta fake_migrate = True che aiuta web2py a ricostruire un dato.

  • format = '%(id)s' - Questa è una stringa di formato che determina come devono essere rappresentati i record nella tabella data.

Generazione di Raw SQL

Utilizzando DAL, possiamo stabilire una connessione al database e creare nuove tabelle e i loro campi utilizzando il costruttore di tabelle e il costruttore di campi.

A volte, è necessario generare istruzioni SQL per conformarsi all'output necessario. web2py include varie funzioni, che aiutano a generare SQL grezzo, che sono fornite come segue:

_inserire

Aiuta a recuperare le istruzioni di inserimento per la tabella data. Per esempio,

print db.person._insert(name ='ABC')

Recupererà l'istruzione di inserimento per la tabella denominata "persona".

Output dell'istruzione SQL -

INSERT INTO person(name) VALUES ('ABC');

_contare

Aiuta a recuperare l'istruzione SQL, che fornisce il conteggio dei record. Ad esempio, considera una tabella denominata "persona" e dobbiamo trovare il conteggio delle persone con nome "ABC".

print db(db.person.name ==' ABC ')._count()

Output dell'istruzione SQL -

SELECT count(*) FROM person WHERE person.name = ' ABC ';

_Selezionare

Aiuta a recuperare le istruzioni SQL selezionate. Ad esempio, considera una tabella denominata "persona" e dobbiamo trovare l'elenco di persone con nome "ABC".

print db(db.person.name == ' ABC ')._select()

Output dell'istruzione SQL -

SELECT person.name FROM person WHERE person.name = ' ABC ';

_Elimina

Aiuta a recuperare il file delete SQLdichiarazioni. Ad esempio, considera per la tabella denominata "persona" e dobbiamo eliminare le istruzioni con il nome "ABC"

print db(db.person.name == ' ABC ')._delete()

Output dell'istruzione SQL -

DELETE FROM person WHERE person.name = ' ABC ';4

_aggiornare

Aiuta a recuperare le istruzioni SQL aggiornate. Ad esempio, considera la tabella denominata "persona" e dobbiamo aggiornare il nome di una colonna con un altro valore.

print db(db.person.name == ' ABC ')._update()

Output dell'istruzione SQL -

UPDATE person SET WHERE person.name = ’Alex’;

Problemi con DAL (Gotchas)

SQLite

SQLite non ha il supporto per eliminare o modificare le colonne. L'eliminazione di un campo dalla tabella lo mantiene attivo nel database, per cui web2py non sarà a conoscenza di eventuali modifiche apportate.

In questo caso, è necessario impostare il file fake_migrate = True che aiuterà a ridefinire i metadati in modo tale che eventuali modifiche come alterare o eliminare saranno mantenute sotto la conoscenza di web2py.

SQLite non supporta i tipi booleani. Per questo, web2py mappa internamente i booleani a 1 stringa di caratteri, con 'T' e 'F' che rappresentanotrue e False rispettivamente.

MySQL

MySQL non supporta la funzione ALTER TABLE. Pertanto, la migrazione del database implica più commit. Questa situazione può essere evitata impostando il parametrofake_migrate = True mentre si definisce il database, che manterrà tutti i metadati.

Oracolo

Oracle non supporta la funzione di impaginazione dei record. Manca anche il supporto per le parole chiave OFFSET o limite. Per questo, web2py ottiene l'impaginazione con l'aiuto di una complessa selezione annidata a tre vie di DAL. DAL deve gestire l'impaginazione da solo, se è stato utilizzato il database Oracle.