Form und grundlegende Datenbankoperationen
Bevor Sie beginnen
Bevor Sie fortfahren, stellen Sie sicher, dass Sie Kenntnisse in SQL sowie in Beziehungen zwischen Tabellen wie „eins zu vielen“ und „vielen zu eins“ haben.
Außerdem sind Vorkenntnisse über die Forms von Netuno und deren Organisation erforderlich, um das Maximum aus dem DB Form herauszuholen.
Einführung
In der Softwareentwicklung müssen wir häufig Informationen aus Datenbanken abrufen, und dies mit reinem SQL zu tun, macht die Sache oft massiv und stressig. Query verwandelt die Erstellung von SQL-Abfragen in eine intuitive und stressfreie Erfahrung. Damit können Sie leistungsstarke Abfragen mit benutzerfreundlichen Methoden erstellen, die die Komplexität von rohem SQL abstrahieren und einen Ansatz zur Abfrageentwicklung bieten, der mit Ihrem Denkfluss übereinstimmt.
Wie es funktioniert
Im Kern des DB Form steht die Fähigkeit, SQL-Befehle mithilfe von Objekten und Methoden zu strukturieren. Anstatt die SQL-Befehle direkt zu schreiben, ermöglicht Ihnen das DB Form, einen objektorientierten Mechanismus zu verwenden, um Abfragen und Operationen programmatisch zu definieren.
Jede Abfrage oder Datenbankoperation wird als Objekt dargestellt.
Sie erstellen Instanzen von Abfrageklassen, die verschiedene Teile des SQL kapseln, wie Auswahl, Filterung, Gruppierung usw. Und Sie führen auch die Operationen zum Löschen, Einfügen und Aktualisieren von Datensätzen aus.
Initialisierung
Alles beginnt mit der Initialisierung des DB Form, das wissen muss, welcher Basis- oder Hauptformularname verwendet wird; das heißt, die Formulare in Netuno repräsentieren immer Tabellen in der Datenbank, daher ist es gleichbedeutend damit, welche Basistabelle oder Haupttabelle verwendet wird.
In diesem Beispiel initialisieren wir das DB Form aus dem Formular/der Tabelle personen:
const dbFormPersonen = _db.form("personen")
Mit dem initialisierten DB Form können wir Abfragen oder Operationen durchführen.
Einfache Abfrage
Das DB Form bietet zwei sehr gebräuchliche Methoden zum Abrufen von Daten, zusätzlich zur Paginierung und zu unterschiedlichen Ergebnissen, nämlich:
all– Alle Datensätze als Liste.first– Ruft nur den ersten Datensatz ab.
Siehe die folgenden Beispiele.
Um alle Personen abzurufen:
const dbPersonen = _db.form("personen")
.all()
Um nur eine Person abzurufen:
const dbPerson = _db.form("personen")
.first()
Filter und Bedingungen
Mit where können wir die Daten filtern, die bestimmte Bedingungen erfüllen.
Siehe einige Beispiele:
const dbPerson = _db.form("personen")
.where(_db.where("personen_user_id").equals(_user.id))
.first()
const dbPersonen = _db.form("personen")
.where(
_db.where("typ").in(_val.list().add("kunde").add("admin"))
.and("email").notEqual(null)
).all()
Where-Vergleiche
Das _db.where stellt das Where-Objekt bereit, das die folgenden Vergleichsoperationen unterstützt:
Vergleiche mit numerischen und textuellen Operatoren:
equal(...)oderequals(...)– Prüft die Gleichheit, entspricht=.notEqual(...)odernotEquals(...)– Ob es sich vom übergebenen Wert unterscheidet, entspricht<>.greaterThan(...)– Ob es größer als der übergebene Wert ist, entspricht>.lessThan(...)– Ob es kleiner als der übergebene Wert ist, entspricht<.greaterOrEqualsThan(...)– Ob es größer oder gleich dem übergebenen Wert ist, entspricht>=.lessOrEqualsThan(...)– Ob es kleiner oder gleich dem übergebenen Wert ist, entspricht<=.
Textbedingungen mit dem Operator LIKE:
startsWith('text')– Wenn es mit dem angegebenen Präfix beginnt, entsprichtLIKE '...%'.endsWith('text')– Wenn es mit dem angegebenen Suffix endet, entsprichtLIKE '%...'.contains('text')– Wenn es den Begriff enthält, entsprichtLIKE '%...%'.
Bedingungen mit Listen mit dem Operator IN:
in(_val.list()...)– Wenn es gleich einem Wert der Liste ist, entspricht der BedingungIN (...).notIn(_val.list()...)– Wenn es keinem Wert der Liste entspricht, entspricht der BedingungNOT IN (...).
Praktische Abfragebeispiele
Das DB Form ist über die Ressource _db.form('formular') zugänglich; nach dem Aufruf haben Sie die Basisabfrage in der Hand, die mit den verfügbaren Methoden und Objekten konfiguriert werden kann.
Viele zu einem und unterschiedliche Ergebnisse
const abfrage = _db.form('personen')
.where(
_db.where('name').startsWith('jail')
.and(
_db.where('email').contains('jai')
.or('email').endsWith('com')
)
)
.link('beruf', _db.where('code').equal('manager'))
.join(
_db.manyToOne(
'netuno_user',
'personen_user_id',
_db.where('mail').startsWith('jai')
).join(
_db.manyToOne(
'netuno_group',
'group_id',
_db.where('code').equal('personen')
)
)
)
.get("personen.name", "personen_name")
.get("personen.aktiv", "personen_aktiv")
.get("personen.uid", "personen_uid")
.debug(true)
.distinct(true)
const ergebnisse = abfrage.all();
Im obigen Beispiel führen wir eine Abfrage für die Tabelle personen durch, die mit zwei weiteren Tabellen verknüpft wird, beruf und netuno_user, wobei beruf über die Methode link und netuno_user über den join verknüpft wird. Es ist zu erkennen, dass link viel einfacher als join ist; das liegt daran, dass link die Beziehung des Netuno-Form wiederverwendet, um die Relation abzubilden, während join nur die in der Methode angegebenen Informationen verwendet. Außerdem lassen sich die weiteren verwendeten Methoden und Objekte erkennen wie:
where: Objekt, das bereitgestellt wird, um Bedingungen für eine Tabelle zu erstellen.link: Methode, die die Haupttabelle mit einer anderen Tabelle unter Verwendung der Kriterien des Netuno-Formverknüpft.join: Methode, die ein Beziehungsobjekt zwischen Tabellen erhält.get: Methode, die definiert, welche Felder in der Abfrage zurückgegeben werden.manyToOne: Objekt, das den Beziehungstyp zwischen Tabellen definiert, in diesem Fall eine Beziehung vom TypMany To One.debug: Methode, die bestimmt, ob die erstellte Abfrage in der Konsole ausgegeben wird.distinct: Methode, die bestimmt, ob der BefehlDISTINCTauf die Abfrage angewendet wird.all: Methode, die die Abfrage ausführt und die Ergebnisse als Liste zurückgibt.
Die Methode
linksollte nur verwendet werden, wenn die Tabellen bereits über das Netuno-Formin Beziehung stehen.
Erster Datensatz mit Beziehung und Sortierung
const abfrage = _db.form('personen')
.where(
_db.where('name').startsWith('jail')
.and('email').in(
_val.list().add('erste@mail.com').add('zweite@mail.com'))
)
.link('beruf')
.get("personen.name", "personen_name")
.get("personen.aktiv", "personen_aktiv")
.get("beruf.code", "beruf_code")
.order('personen.alter', 'desc')
.debug(true)
const erstesErgebnis = abfrage.first();
Am Ende des obigen Beispiels rufen wir die Methode first() auf; diese gibt das erste bei der Ausführung der Abfrage gefundene Vorkommen zurück; falls keines gefunden wird, wird null zurückgegeben.
Paginierung
const abfrage = _db.form('personen')
.link(
'beruf',
_db.link('aufgabe')
)
.get("personen.name", "personen_name")
.get("personen.aktiv", "personen_aktiv")
.get("beruf.code", "beruf_code")
.group("personen.id")
.debug(true)
const seite = abfrage.page(_db.pagination(1, 10));
Die Seitennummer im Pagination-Objekt beginnt bei 1, daher entspricht das obige Beispiel:
offset = 0undlimit = 10.
Am Ende des obigen Beispiels rufen wir die Methode page() auf und übergeben als Parameter das pagination-Objekt, das die Paginierungseinstellungen enthält. Dies gibt ein Seitenobjekt mit den entsprechenden Attributen zurück, zum Beispiel:
{
"hasNext": false,
"hasPrevious": false,
"items": [
{
"beruf_code": "trainee",
"personen_aktiv": true,
"personen_name": "Junior Freitas"
},
{
"beruf_code": "manager",
"personen_aktiv": true,
"personen_name": "Caio Andrade"
}
],
"pageNumber": 1,
"pageSize": 10,
"totalElements": 2,
"totalPages": 1
}
Datensätze einfügen
Um Daten in die Datenbank einzufügen, verwenden wir die Methode insert, zum Beispiel:
const dbPersonEingefuegt = _db.form("personen")
.set("name", "Caio Andrade")
.set("email", "caio@mail.com")
.insert();
Mit dem Ergebnis von insert können wir die ID des Datensatzes abrufen, der in die Datenbank eingefügt wurde.
Daher erhält man in dbPersonEingefuegt die id des eingefügten Datensatzes wie folgt:
_log.info("Personen-ID eingefügt: "+ dbPersonEingefuegt.getInt('id'))
Datensätze bearbeiten
Über das DB Form können Sie die Datensätze der Abfrage einfach und intuitiv aktualisieren.
_db.form('personen')
.link(
'beruf',
_db.where('code').equal('trainee')
)
.set("name", "neuer Name")
.set("email", "meineneueemail@mail.com")
.update();
Wichtig. Die Methodeupdate()aktualisiert alle Vorkommen der Abfrage, daher Vorsicht bei der Verwendung.
Darüber hinaus können Sie andere Methoden wie
order()undlimit()kombinieren, um Ihre Abfragen zu verbessern.
Datensätze löschen
Das DB Form ermöglicht es Ihnen außerdem, in der Abfrage zurückgegebene Datensätze einfach zu löschen.
_db.form('personen')
.link(
'beruf',
_db.where('code').equal('trainee')
)
.delete();
Wichtig. Die Methodedelete()löscht alle Vorkommen der Abfrage, daher Vorsicht bei der Verwendung.
Wie bei den anderen ist es möglich, andere Methoden wie
order()undlimit()zu kombinieren, um die Ergebnisse zu verbessern.