Lua - Accesso al database

Per semplici operazioni sui dati, potremmo utilizzare i file, ma, a volte, queste operazioni sui file potrebbero non essere efficienti, scalabili e potenti. A tal fine, potremmo spesso passare all'utilizzo dei database. LuaSQL è una semplice interfaccia da Lua a numerosi sistemi di gestione di database. LuaSQL è la libreria, che fornisce supporto per diversi tipi di SQL. Questo include,

  • SQLite
  • Mysql
  • ODBC

In questo tutorial, tratteremo la gestione del database di MySQL e SQLite in Lua. Questo utilizza un'interfaccia generica per entrambi e dovrebbe essere possibile portare questa implementazione anche su altri tipi di database. Per prima cosa vediamo come puoi eseguire le operazioni in MySQL.

Installazione db MySQL

Per poter utilizzare i seguenti esempi per funzionare come previsto, è necessaria la configurazione iniziale del database. Le ipotesi sono elencate di seguito.

  • Hai installato e configurato MySQL con l'utente predefinito come root e la password come "123456".

  • Hai creato un test del database.

  • Hai seguito il tutorial di MySQL per comprendere le basi di MySQL.

Importazione di MySQL

Possiamo usare un semplice require istruzione per importare la libreria sqlite assumendo che l'implementazione di Lua sia stata eseguita correttamente.

mysql = require "luasql.mysql"

La variabile mysql fornirà l'accesso alle funzioni facendo riferimento alla tabella principale di mysql.

Configurazione della connessione

Possiamo impostare la connessione avviando un ambiente MySQL e quindi creando una connessione per l'ambiente. È mostrato di seguito.

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

La connessione di cui sopra si collegherà a un file MySQL esistente e stabilirà la connessione con il file appena creato.

Esegui funzione

C'è una semplice funzione di esecuzione disponibile con la connessione che ci aiuterà a fare tutte le operazioni del db da creare, inserire, eliminare, aggiornare e così via. La sintassi è mostrata di seguito:

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

Nella sintassi precedente, dobbiamo assicurarci che la connessione sia aperta e la connessione MySQL esistente e sostituire "MySQLSTATEMENT" con la dichiarazione corretta.

Crea esempio di tabella

Di seguito è mostrato un semplice esempio di creazione di una tabella. Crea una tabella con due parametri id di tipo integer e nome di tipo varchar.

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 )

Quando si esegue il programma precedente, verrà creata una tabella denominata sample con due colonne, ovvero id e name.

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

In caso di errore, ti verrà restituita una dichiarazione di errore invece di zero. Di seguito viene mostrata una semplice dichiarazione di errore.

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

Inserisci esempio di istruzione

Di seguito è mostrata un'istruzione di inserimento per MySQL.

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

Esempio di istruzione di aggiornamento

Di seguito è mostrata una dichiarazione di aggiornamento per MySQL.

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

Elimina esempio di istruzione

Di seguito è mostrata un'istruzione di eliminazione per MySQL.

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

Seleziona Esempio di istruzione

Per quanto riguarda l'istruzione select, dobbiamo scorrere ciascuna delle righe ed estrarre i dati richiesti. Di seguito viene mostrata una semplice istruzione select.

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

Nel codice sopra, conn è una connessione MySQL aperta. Con l'aiuto del cursore restituito dall'istruzione execute, è possibile scorrere la risposta della tabella e recuperare i dati di selezione richiesti.

Un esempio completo

Di seguito viene fornito un esempio completo che include tutte le dichiarazioni di cui sopra.

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()

Quando esegui il programma sopra, otterrai il seguente output.

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

Esecuzione di transazioni

Le transazioni sono un meccanismo che garantisce la coerenza dei dati. Le transazioni dovrebbero avere le seguenti quattro proprietà:

  • Atomicity - O una transazione viene completata o non accade nulla.

  • Consistency - Una transazione deve iniziare in uno stato coerente e lasciare il sistema in uno stato coerente.

  • Isolation - I risultati intermedi di una transazione non sono visibili al di fuori della transazione corrente.

  • Durability - Una volta eseguito il commit di una transazione, gli effetti sono persistenti, anche dopo un errore di sistema.

La transazione inizia con START TRANSACTION; e termina con l'istruzione commit o rollback.

Avvia transazione

Per avviare una transazione, dobbiamo eseguire la seguente istruzione in Lua, supponendo che conn sia una connessione MySQL aperta.

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

Transazione di rollback

È necessario eseguire la seguente istruzione per ripristinare le modifiche apportate dopo l'esecuzione della transazione di avvio.

conn:execute([[ROLLBACK;]])

Commit Transaction

È necessario eseguire la seguente istruzione per eseguire il commit delle modifiche apportate dopo l'esecuzione della transazione di avvio.

conn:execute([[COMMIT;]])

Abbiamo conosciuto MySQL nella sezione precedente e seguente spiega le operazioni SQL di base. Ricorda le transazioni, anche se non spiegato di nuovo per SQLite3, ma le stesse istruzioni dovrebbero funzionare anche per SQLite3.

Importazione di SQLite

Possiamo usare una semplice istruzione require per importare la libreria SQLite assumendo che la tua implementazione di Lua sia stata eseguita correttamente. Durante l'installazione, una cartella libsql che contiene i file relativi al database.

sqlite3 = require "luasql.sqlite3"

La variabile sqlite3 fornirà l'accesso alle funzioni facendo riferimento alla tabella principale di sqlite3.

Configurazione della connessione

Possiamo impostare la connessione avviando un ambiente SQLite e quindi creando una connessione per l'ambiente. È mostrato di seguito.

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

La connessione sopra si connetterà a un file SQLite esistente o creerà un nuovo file SQLite e stabilirà la connessione con il file appena creato.

Esegui funzione

C'è una semplice funzione di esecuzione disponibile con la connessione che ci aiuterà a fare tutte le operazioni del db da creare, inserire, eliminare, aggiornare e così via. La sintassi è mostrata di seguito:

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

Nella sintassi precedente dobbiamo assicurarci che conn sia aperta e che esista una connessione sqlite3 e sostituire "SQLite3STATEMENT" con l'istruzione corretta.

Crea esempio di tabella

Di seguito è mostrato un semplice esempio di creazione di una tabella. Crea una tabella con due parametri id di tipo integer e nome di tipo varchar.

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 )

Quando si esegue il programma precedente, verrà creata una tabella denominata sample con due colonne, ovvero id e name.

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

In caso di errore, ti verrà restituita una dichiarazione di errore invece di zero. Di seguito viene mostrata una semplice dichiarazione di errore.

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

Inserisci esempio di istruzione

Di seguito è mostrata un'istruzione di inserimento per SQLite.

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

Seleziona Esempio di istruzione

Per quanto riguarda l'istruzione select, dobbiamo scorrere ciascuna delle righe ed estrarre i dati richiesti. Di seguito viene mostrata una semplice istruzione select.

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

Nel codice sopra, conn è una connessione sqlite3 aperta. Con l'aiuto del cursore restituito dall'istruzione execute, è possibile scorrere la risposta della tabella e recuperare i dati di selezione richiesti.

Un esempio completo

Di seguito viene fornito un esempio completo che include tutte le dichiarazioni di cui sopra.

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()

Quando esegui il programma sopra, otterrai il seguente output.

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

Possiamo eseguire tutte le query disponibili con l'aiuto di questa libreria libsql. Quindi, per favore, non fermarti con questi esempi. Sperimenta varie istruzioni di query disponibili nei rispettivi MySQL, SQLite3 e altri db supportati in Lua.