Lua - Datenbankzugriff

Für einfache Datenoperationen verwenden wir möglicherweise Dateien, aber manchmal sind diese Dateivorgänge möglicherweise nicht effizient, skalierbar und leistungsstark. Zu diesem Zweck wechseln wir häufig zur Verwendung von Datenbanken. LuaSQL ist eine einfache Schnittstelle von Lua zu einer Reihe von Datenbankverwaltungssystemen. LuaSQL ist die Bibliothek, die verschiedene Arten von SQL unterstützt. Dazu gehören:

  • SQLite
  • Mysql
  • ODBC

In diesem Tutorial werden wir uns mit der Datenbankverarbeitung von MySQL und SQLite in Lua befassen. Dies verwendet eine generische Schnittstelle für beide und sollte möglich sein, diese Implementierung auch auf andere Datenbanktypen zu portieren. Lassen Sie uns zunächst sehen, wie Sie die Operationen in MySQL ausführen können.

MySQL db Setup

Damit die folgenden Beispiele wie erwartet funktionieren, benötigen wir das anfängliche Datenbank-Setup. Die Annahmen sind unten aufgeführt.

  • Sie haben MySQL mit dem Standardbenutzer als Root und dem Kennwort '123456' installiert und eingerichtet.

  • Sie haben einen Datenbanktest erstellt.

  • Sie haben das MySQL-Tutorial durchgearbeitet, um die MySQL-Grundlagen zu verstehen .

MySQL importieren

Wir können eine einfache verwenden require Anweisung zum Importieren der SQLite-Bibliothek unter der Annahme, dass Ihre Lua-Implementierung korrekt durchgeführt wurde.

mysql = require "luasql.mysql"

Die Variable mysql ermöglicht den Zugriff auf die Funktionen unter Bezugnahme auf die Haupttabelle mysql.

Verbindung einrichten

Wir können die Verbindung einrichten, indem wir eine MySQL-Umgebung initiieren und dann eine Verbindung für die Umgebung herstellen. Es ist unten gezeigt.

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')

Die obige Verbindung stellt eine Verbindung zu einer vorhandenen MySQL-Datei her und stellt die Verbindung mit der neu erstellten Datei her.

Funktion ausführen

Mit der Verbindung steht eine einfache Ausführungsfunktion zur Verfügung, mit der wir alle Datenbankoperationen wie Erstellen, Einfügen, Löschen, Aktualisieren usw. ausführen können. Die Syntax wird unten gezeigt -

conn:execute([[ 'MySQLSTATEMENT' ]])

In der obigen Syntax müssen wir sicherstellen, dass conn offen ist und eine MySQL-Verbindung besteht, und die 'MySQLSTATEMENT' durch die richtige Anweisung ersetzen.

Tabellenbeispiel erstellen

Ein einfaches Beispiel zum Erstellen einer Tabelle ist unten dargestellt. Es wird eine Tabelle mit zwei Parametern ID vom Typ Ganzzahl und Name vom Typ Varchar erstellt.

mysql = require "luasql.mysql"

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')

print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample2 (id INTEGER, name TEXT);]])
print(status,errorString )

Wenn Sie das obige Programm ausführen, wird eine Tabelle mit dem Namen sample mit zwei Spalten erstellt, nämlich id und name.

MySQL environment (004BB178)	MySQL connection (004BE3C8)
0	nil

Im Fehlerfall wird anstelle von Null eine Fehleranweisung zurückgegeben. Eine einfache Fehleranweisung ist unten dargestellt.

LuaSQL: Error executing query. MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"id INTEGER, name TEXT)' at line 1

Beispiel für eine Anweisung einfügen

Eine insert-Anweisung für MySQL ist unten dargestellt.

conn:execute([[INSERT INTO sample values('11','Raj')]])

Beispiel für eine Update-Anweisung

Eine Update-Anweisung für MySQL ist unten dargestellt.

conn:execute([[UPDATE sample3 SET name='John' where id ='12']])

Beispiel für eine Anweisung löschen

Eine Löschanweisung für MySQL ist unten dargestellt.

conn:execute([[DELETE from sample3 where id ='12']])

Wählen Sie Anweisungsbeispiel

In Bezug auf die select-Anweisung müssen wir jede der Zeilen durchlaufen und die erforderlichen Daten extrahieren. Eine einfache select-Anweisung ist unten dargestellt.

cursor,errorString = conn:execute([[select * from sample]])
row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   -- reusing the table of results
   row = cursor:fetch (row, "a")
end

Im obigen Code ist conn eine offene MySQL-Verbindung. Mit Hilfe des von der execute-Anweisung zurückgegebenen Cursors können Sie die Tabellenantwort durchlaufen und die erforderlichen Auswahldaten abrufen.

Ein vollständiges Beispiel

Ein vollständiges Beispiel mit allen obigen Aussagen ist unten angegeben.

mysql = require "luasql.mysql"

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample3 (id INTEGER, name TEXT)]])
print(status,errorString )

status,errorString = conn:execute([[INSERT INTO sample3 values('12','Raj')]])
print(status,errorString )

cursor,errorString = conn:execute([[select * from sample3]])
print(cursor,errorString)

row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   row = cursor:fetch (row, "a")
end

-- close everything
cursor:close()
conn:close()
env:close()

Wenn Sie das obige Programm ausführen, erhalten Sie die folgende Ausgabe.

MySQL environment (0037B178)	MySQL connection (0037EBA8)
0	nil
1	nil
MySQL cursor (003778A8)	nil
Id: 12, Name: Raj

Transaktionen durchführen

Transaktionen sind ein Mechanismus, der die Datenkonsistenz gewährleistet. Transaktionen sollten die folgenden vier Eigenschaften haben:

  • Atomicity - Entweder wird eine Transaktion abgeschlossen oder es passiert überhaupt nichts.

  • Consistency - Eine Transaktion muss in einem konsistenten Zustand beginnen und das System in einem konsistenten Zustand belassen.

  • Isolation - Zwischenergebnisse einer Transaktion sind außerhalb der aktuellen Transaktion nicht sichtbar.

  • Durability - Sobald eine Transaktion festgeschrieben wurde, bleiben die Auswirkungen auch nach einem Systemausfall bestehen.

Die Transaktion beginnt mit START TRANSACTION. und endet mit einer Commit- oder Rollback-Anweisung.

Transaktion starten

Um eine Transaktion zu initiieren, müssen wir die folgende Anweisung in Lua ausführen, vorausgesetzt, conn ist eine offene MySQL-Verbindung.

conn:execute([[START TRANSACTION;]])

Rollback-Transaktion

Wir müssen die folgende Anweisung ausführen, um Änderungen rückgängig zu machen, die nach der Ausführung der Starttransaktion vorgenommen wurden.

conn:execute([[ROLLBACK;]])

Transaktion festschreiben

Wir müssen die folgende Anweisung ausführen, um Änderungen festzuschreiben, die nach der Ausführung der Starttransaktion vorgenommen wurden.

conn:execute([[COMMIT;]])

Wir haben im obigen Abschnitt von MySQL gewusst und im folgenden Abschnitt werden grundlegende SQL-Operationen erläutert. Denken Sie daran, dass Transaktionen zwar für SQLite3 nicht noch einmal erklärt wurden, die gleichen Anweisungen jedoch auch für SQLite3 funktionieren sollten.

SQLite importieren

Wir können eine einfache require-Anweisung verwenden, um die SQLite-Bibliothek zu importieren, vorausgesetzt, Ihre Lua-Implementierung wurde korrekt durchgeführt. Während der Installation ein Ordner libsql, der die datenbankbezogenen Dateien enthält.

sqlite3 = require "luasql.sqlite3"

Die Variable sqlite3 ermöglicht den Zugriff auf die Funktionen unter Bezugnahme auf die Haupttabelle sqlite3.

Verbindung einrichten

Wir können die Verbindung einrichten, indem wir eine SQLite-Umgebung initiieren und dann eine Verbindung für die Umgebung herstellen. Es ist unten gezeigt.

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')

Die obige Verbindung stellt eine Verbindung zu einer vorhandenen SQLite-Datei her oder erstellt eine neue SQLite-Datei und stellt die Verbindung mit der neu erstellten Datei her.

Funktion ausführen

Mit der Verbindung steht eine einfache Ausführungsfunktion zur Verfügung, mit der wir alle Datenbankoperationen wie Erstellen, Einfügen, Löschen, Aktualisieren usw. ausführen können. Die Syntax wird unten gezeigt -

conn:execute([[ 'SQLite3STATEMENT' ]])

In der obigen Syntax müssen wir sicherstellen, dass conn offen ist und eine SQLite3-Verbindung besteht, und die 'SQLite3STATEMENT' durch die richtige Anweisung ersetzen.

Tabellenbeispiel erstellen

Ein einfaches Beispiel zum Erstellen einer Tabelle ist unten dargestellt. Es wird eine Tabelle mit zwei Parametern ID vom Typ Ganzzahl und Name vom Typ Varchar erstellt.

sqlite3 = require "luasql.sqlite3"

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample ('id' INTEGER, 'name' TEXT)]])
print(status,errorString )

Wenn Sie das obige Programm ausführen, wird eine Tabelle mit dem Namen sample mit zwei Spalten erstellt, nämlich id und name.

SQLite3 environment (003EC918)	SQLite3 connection (00421F08)
0	nil

Im Falle eines Fehlers erhalten Sie eine Fehleranweisung anstelle von Null. Eine einfache Fehleranweisung ist unten dargestellt.

LuaSQL: unrecognized token: ""'id' INTEGER, 'name' TEXT)"

Beispiel für eine Anweisung einfügen

Eine Einfügeanweisung für SQLite wird unten gezeigt.

conn:execute([[INSERT INTO sample values('11','Raj')]])

Wählen Sie Anweisungsbeispiel

In Bezug auf die select-Anweisung müssen wir jede der Zeilen durchlaufen und die erforderlichen Daten extrahieren. Eine einfache select-Anweisung ist unten dargestellt.

cursor,errorString = conn:execute([[select * from sample]])
row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   -- reusing the table of results
   row = cursor:fetch (row, "a")
end

Im obigen Code ist conn eine offene sqlite3-Verbindung. Mit Hilfe des von der execute-Anweisung zurückgegebenen Cursors können Sie die Tabellenantwort durchlaufen und die erforderlichen Auswahldaten abrufen.

Ein vollständiges Beispiel

Ein vollständiges Beispiel mit allen obigen Aussagen ist unten angegeben.

sqlite3 = require "luasql.sqlite3"

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample ('id' INTEGER, 'name' TEXT)]])
print(status,errorString )

status,errorString = conn:execute([[INSERT INTO sample values('1','Raj')]])
print(status,errorString )

cursor,errorString = conn:execute([[select * from sample]])
print(cursor,errorString)

row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   row = cursor:fetch (row, "a")
end

-- close everything
cursor:close()
conn:close()
env:close()

Wenn Sie das obige Programm ausführen, erhalten Sie die folgende Ausgabe.

SQLite3 environment (005EC918)	SQLite3 connection (005E77B0)
0	nil
1	nil
SQLite3 cursor (005E9200)	nil
Id: 1, Name: Raj

Mit Hilfe dieser libsql-Bibliothek können wir alle verfügbaren Abfragen ausführen. Hören Sie also bitte nicht mit diesen Beispielen auf. Experimentieren Sie mit verschiedenen Abfrageanweisungen, die in MySQL, SQLite3 und anderen unterstützten Datenbanken in Lua verfügbar sind.