Web2py - Datenbank-Abstraktionsschicht
Das Database Abstraction Layer (DAL)wird als die Hauptstärke von web2py angesehen. Der DAL stellt eine einfache API (Applications Programming Interface) der zugrunde liegenden SQL-Syntax zur Verfügung.
In diesem Kapitel lernen wir die nicht trivialen Anwendungen von DAL kennen, z. B. das Erstellen von Abfragen zur effizienten Suche nach Tags und das Erstellen eines hierarchischen Kategoriebaums.
Einige wichtige Merkmale von DAL sind -
web2py enthält einen Database Abstraction Layer (DAL), eine API, die Python-Objekte in Datenbankobjekte abbildet. Die Datenbankobjekte können Abfragen, Tabellen und Datensätze sein.
Die DAL generiert das SQL dynamisch in Echtzeit unter Verwendung des angegebenen Dialekts für das Datenbank-Back-End, sodass ein Entwickler keine vollständige SQL-Abfrage schreiben muss.
Der Hauptvorteil der Verwendung von DAL besteht darin, dass die Anwendungen mit verschiedenen Arten von Datenbanken portierbar sind.
Erste Schritte mit DAL
Die meisten Anwendungen in web2py erfordern eine Datenbankverbindung. Daher ist das Erstellen des Datenbankmodells der erste Schritt beim Entwurf einer Anwendung.
Betrachten Sie die neu erstellte Anwendung mit dem Namen “helloWorld”. Die Datenbank wird unter den Modellen der Anwendung implementiert. Alle Modelle für die jeweilige Anwendung befinden sich unter der Datei -.models/db_custom.py.
Die folgenden Schritte werden zur Implementierung von DAL verwendet -
Schritt 1 - DAL-Konstruktor
Stellen Sie eine Datenbankverbindung her. Dies wird mit dem DAL-Objekt erstellt, das auch als DAL-Konstruktor bezeichnet wird.
db = DAL ('sqlite://storage.sqlite')
Das bemerkenswerte Merkmal von DAL ist, dass es mehrere Verbindungen mit derselben Datenbank oder mit verschiedenen Datenbanken ermöglicht, selbst mit verschiedenen Datenbanktypen. Es wird beobachtet, dass diese Zeile bereits in der Datei enthalten istmodels/db.py. Daher benötigen Sie es möglicherweise nicht, es sei denn, Sie haben es gelöscht oder müssen eine Verbindung zu einer anderen Datenbank herstellen. Standardmäßig stellt web2py eine Verbindung zu einer in einer Datei gespeicherten SQLite-Datenbank herstorage.sqlite.
Diese Datei befindet sich im Datenbankordner der Anwendung. Wenn die Datei nicht vorhanden ist, wird sie von web2py erstellt, wenn die Anwendung zum ersten Mal ausgeführt wird.
SQLite ist schnell und speichert alle Daten in einer einzigen Datei. Dies bedeutet, dass Ihre Daten problemlos von einer Anwendung in eine andere übertragen werden können. Tatsächlich werden die SQLite-Datenbanken von web2py zusammen mit den Anwendungen gepackt. Es bietet vollständige SQL-Unterstützung, einschließlich Übersetzungen, Verknüpfungen und Aggregate.
Es gibt zwei Nachteile von SQLite.
Zum einen werden keine Spaltentypen erzwungen, und es gibt keine ALTER TABLE, außer zum Hinzufügen und Löschen von Spalten.
Der andere Nachteil ist, dass die gesamte Datenbank durch jede Transaktion gesperrt ist, die Schreibzugriff erfordert.
Schritt 2 - Tabellenkonstruktor
Sobald die Verbindung mit der Datenbank hergestellt ist, können wir die verwenden define_table Methode zum Definieren neuer Tabellen.
Zum Beispiel -
db.define_table('invoice',Field('name'))
Das obige Verfahren wird auch unter Tabellenkonstruktoren verwendet. Die Syntax für den Tabellenkonstruktor ist dieselbe. Das erste Argument ist der Tabellenname, gefolgt von einer Liste vonField(s). Der Feldkonstruktor akzeptiert die folgenden Argumente:
Sr.Nr. | Argumente & Verwendung |
---|---|
1 | The field name Name des Feldes in der Tabelle. |
2 | The field type Nimmt Werte mit einem der Datentypen wie Zeichenfolge (Standard), Text, Boolescher Wert, Ganzzahl usw. an. |
3 | Length Definiert die maximale Länge. |
4 | default = None Dies ist der Standardwert, wenn ein neuer Datensatz eingefügt wird. |
5 | update = None Dies funktioniert genauso wie die Standardeinstellung, der Wert wird jedoch nur beim Aktualisieren und nicht beim Einfügen verwendet. |
6 | Notnull Dies gibt an, ob der Feldwert NULL sein kann oder nicht. |
7 | readable = True Dies gibt an, ob das Feld in Formularen lesbar ist oder nicht. |
8 | writable = True Dies gibt an, ob das Feld in Formularen beschreibbar ist oder nicht. |
9 | label = "Field Name" Dies ist die Bezeichnung, die für dieses Feld in Formularen verwendet werden soll. |
Das define_table Methode akzeptiert auch drei benannte Argumente -
Syntax
db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
migrate = True - Dadurch wird web2py angewiesen, die Tabelle zu erstellen, wenn sie nicht vorhanden ist, oder sie zu ändern, wenn sie nicht mit der Modelldefinition übereinstimmt.
fake_migrate = False - Wenn das Modell mit dem Inhalt der Datenbanktabelle übereinstimmt, setzen Sie fake_migrate = True, um web2py beim erneuten Erstellen von Daten zu unterstützen.
format = '%(id)s' - Dies ist eine Formatzeichenfolge, die bestimmt, wie Datensätze in der angegebenen Tabelle dargestellt werden sollen.
Generieren von Raw SQL
Mit DAL können wir eine Verbindung zur Datenbank herstellen und mit dem Tabellenkonstruktor und dem Feldkonstruktor neue Tabellen und deren Felder erstellen.
Manchmal ist es erforderlich, SQL-Anweisungen zu generieren, um der erforderlichen Ausgabe zu entsprechen. web2py enthält verschiedene Funktionen, die beim Generieren von unformatiertem SQL helfen. Diese werden wie folgt angegeben:
_einfügen
Es hilft beim Abrufen von Einfügeanweisungen für die angegebene Tabelle. Zum Beispiel,
print db.person._insert(name ='ABC')
Es wird die Einfügeanweisung für die Tabelle mit dem Namen "Person" abgerufen.
SQL-Anweisungsausgabe -
INSERT INTO person(name) VALUES ('ABC');
_Anzahl
Es hilft beim Abrufen der SQL-Anweisung, die die Anzahl der Datensätze angibt. Stellen Sie sich zum Beispiel eine Tabelle mit dem Namen "Person" vor und wir müssen die Anzahl der Personen mit dem Namen "ABC" ermitteln.
print db(db.person.name ==' ABC ')._count()
SQL-Anweisungsausgabe -
SELECT count(*) FROM person WHERE person.name = ' ABC ';
_wählen
Es hilft beim Abrufen ausgewählter SQL-Anweisungen. Stellen Sie sich zum Beispiel eine Tabelle mit dem Namen "Person" vor und wir müssen die Liste der Personen mit dem Namen "ABC" finden.
print db(db.person.name == ' ABC ')._select()
SQL-Anweisungsausgabe -
SELECT person.name FROM person WHERE person.name = ' ABC ';
_löschen
Es hilft beim Abrufen der delete SQLAussagen. Betrachten Sie zum Beispiel die Tabelle 'person' und wir müssen die Anweisungen mit dem Namen 'ABC' löschen.
print db(db.person.name == ' ABC ')._delete()
SQL-Anweisungsausgabe -
DELETE FROM person WHERE person.name = ' ABC ';4
_aktualisieren
Es hilft beim Abrufen aktualisierter SQL-Anweisungen. Betrachten Sie beispielsweise die Tabelle 'person' und wir müssen einen Spaltennamen mit einem anderen Wert aktualisieren.
print db(db.person.name == ' ABC ')._update()
SQL-Anweisungsausgabe -
UPDATE person SET WHERE person.name = ’Alex’;
Probleme mit DAL (Gotchas)
SQLite
SQLite bietet keine Unterstützung für das Löschen oder Ändern der Spalten. Durch das Löschen eines Felds aus der Tabelle bleibt es in der Datenbank aktiv, sodass web2py keine Änderungen bemerkt.
In diesem Fall muss das eingestellt werden fake_migrate = True Dies hilft bei der Neudefinition der Metadaten, sodass Änderungen wie Ändern oder Löschen unter dem Wissen von web2py gespeichert werden.
SQLite unterstützt keine Booleschen Typen. Zu diesem Zweck ordnet web2py die Booleschen Werte intern einer Zeichenfolge zu, wobei 'T' und 'F' stehentrue und False beziehungsweise.
MySQL
MySQL unterstützt die ALTER TABLE-Funktion nicht. Daher umfasst die Migration der Datenbank mehrere Commits. Diese Situation kann durch Einstellen des Parameters vermieden werdenfake_migrate = True während Sie die Datenbank definieren, die alle Metadaten beibehält.
Orakel
Oracle unterstützt die Funktion der Paginierung von Datensätzen nicht. Es fehlt auch die Unterstützung für die Schlüsselwörter OFFSET oder Limit. Zu diesem Zweck erreicht web2py die Paginierung mithilfe einer komplexen dreifach verschachtelten Auswahl von DAL. DAL muss die Paginierung selbstständig verarbeiten, wenn eine Oracle-Datenbank verwendet wurde.