Lua - Accès à la base de données

Pour les opérations de données simples, nous pouvons utiliser des fichiers, mais, parfois, ces opérations sur les fichiers peuvent ne pas être efficaces, évolutives et puissantes. Pour cela, nous pouvons souvent passer à l'utilisation de bases de données. LuaSQL est une interface simple de Lua à un certain nombre de systèmes de gestion de base de données. LuaSQL est la bibliothèque qui prend en charge différents types de SQL. Cela comprend,

  • SQLite
  • Mysql
  • ODBC

Dans ce tutoriel, nous couvrirons la gestion des bases de données de MySQL et SQLite en Lua. Cela utilise une interface générique pour les deux et devrait également être possible de porter cette implémentation vers d'autres types de bases de données. Voyons d'abord comment vous pouvez effectuer les opérations dans MySQL.

Configuration de la base de données MySQL

Pour que les exemples suivants fonctionnent comme prévu, nous avons besoin de la configuration initiale de la base de données. Les hypothèses sont énumérées ci-dessous.

  • Vous avez installé et configuré MySQL avec l'utilisateur par défaut comme root et le mot de passe comme «123456».

  • Vous avez créé un test de base de données.

  • Vous avez parcouru le didacticiel MySQL pour comprendre les bases de MySQL.

Importer MySQL

Nous pouvons utiliser un simple require pour importer la bibliothèque sqlite en supposant que votre implémentation Lua a été effectuée correctement.

mysql = require "luasql.mysql"

La variable mysql donnera accès aux fonctions en se référant à la table principale mysql.

Configuration de la connexion

Nous pouvons configurer la connexion en lançant un environnement MySQL puis en créant une connexion pour l'environnement. Il est montré ci-dessous.

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

La connexion ci-dessus se connectera à un fichier MySQL existant et établira la connexion avec le fichier nouvellement créé.

Exécuter la fonction

Il existe une fonction d'exécution simple disponible avec la connexion qui nous aidera à effectuer toutes les opérations de base de données de création, d'insertion, de suppression, de mise à jour, etc. La syntaxe est indiquée ci-dessous -

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

Dans la syntaxe ci-dessus, nous devons nous assurer que conn est ouvert et que la connexion MySQL existe et remplacer «MySQLSTATEMENT» par l'instruction correcte.

Créer un exemple de table

Un exemple simple de création de table est présenté ci-dessous. Il crée une table avec deux paramètres id de type integer et nom de type 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 )

Lorsque vous exécutez le programme ci-dessus, une table nommée sample sera créée avec deux colonnes à savoir, id et name.

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

En cas d'erreur, vous recevrez une instruction d'erreur au lieu de nil. Une simple déclaration d'erreur est présentée ci-dessous.

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

Insérer un exemple de déclaration

Une instruction d'insertion pour MySQL est présentée ci-dessous.

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

Exemple de déclaration de mise à jour

Une instruction de mise à jour pour MySQL est présentée ci-dessous.

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

Exemple d'instruction de suppression

Une instruction de suppression pour MySQL est présentée ci-dessous.

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

Sélectionnez un exemple de déclaration

En ce qui concerne l'instruction select, nous devons parcourir chacune des lignes et extraire les données requises. Une instruction de sélection simple est présentée ci-dessous.

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

Dans le code ci-dessus, conn est une connexion MySQL ouverte. À l'aide du curseur renvoyé par l'instruction d'exécution, vous pouvez parcourir la réponse de la table et récupérer les données de sélection requises.

Un exemple complet

Un exemple complet comprenant toutes les déclarations ci-dessus est donné ci-dessous.

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

Lorsque vous exécutez le programme ci-dessus, vous obtiendrez la sortie suivante.

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

Effectuer des transactions

Les transactions sont un mécanisme qui garantit la cohérence des données. Les transactions doivent avoir les quatre propriétés suivantes -

  • Atomicity - Soit une transaction se termine, soit rien ne se passe du tout.

  • Consistency - Une transaction doit démarrer dans un état cohérent et laisser le système dans un état cohérent.

  • Isolation - Les résultats intermédiaires d'une transaction ne sont pas visibles en dehors de la transaction en cours.

  • Durability - Une fois qu'une transaction a été validée, les effets sont persistants, même après une panne du système.

La transaction commence par START TRANSACTION; et se termine par une instruction de validation ou d'annulation.

Commencer la transaction

Afin d'initier une transaction, nous devons exécuter l'instruction suivante en Lua, en supposant que conn est une connexion MySQL ouverte.

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

Transaction d'annulation

Nous devons exécuter l'instruction suivante pour annuler les modifications apportées après l'exécution de la transaction de démarrage.

conn:execute([[ROLLBACK;]])

Valider la transaction

Nous devons exécuter l'instruction suivante pour valider les modifications apportées après l'exécution de la transaction de démarrage.

conn:execute([[COMMIT;]])

Nous avons connu MySQL dans la section ci-dessus et la section suivante explique les opérations SQL de base. Rappelez-vous les transactions, bien que cela ne soit pas expliqué à nouveau pour SQLite3, mais les mêmes instructions devraient également fonctionner pour SQLite3.

Importer SQLite

Nous pouvons utiliser une simple instruction require pour importer la bibliothèque SQLite en supposant que votre implémentation Lua a été effectuée correctement. Lors de l'installation, un dossier libsql contenant les fichiers liés à la base de données.

sqlite3 = require "luasql.sqlite3"

La variable sqlite3 donnera accès aux fonctions en se référant à la table principale sqlite3.

Configuration de la connexion

Nous pouvons configurer la connexion en lançant un environnement SQLite, puis en créant une connexion pour l'environnement. Il est montré ci-dessous.

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

La connexion ci-dessus se connecte à un fichier SQLite existant ou crée un nouveau fichier SQLite et établit la connexion avec le fichier nouvellement créé.

Exécuter la fonction

Il existe une fonction d'exécution simple disponible avec la connexion qui nous aidera à effectuer toutes les opérations de base de données de création, d'insertion, de suppression, de mise à jour, etc. La syntaxe est indiquée ci-dessous -

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

Dans la syntaxe ci-dessus, nous devons nous assurer que conn est ouvert et que la connexion sqlite3 existe et remplacer «SQLite3STATEMENT» par l'instruction correcte.

Créer un exemple de table

Un exemple simple de création de table est présenté ci-dessous. Il crée une table avec deux paramètres id de type integer et nom de type 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 )

Lorsque vous exécutez le programme ci-dessus, une table nommée sample sera créée avec deux colonnes à savoir, id et name.

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

En cas d'erreur, vous recevrez une instruction d'erreur au lieu de nil. Une simple déclaration d'erreur est présentée ci-dessous.

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

Insérer un exemple de déclaration

Une instruction d'insertion pour SQLite est présentée ci-dessous.

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

Sélectionnez un exemple de déclaration

En ce qui concerne l'instruction select, nous devons parcourir chacune des lignes et extraire les données requises. Une instruction de sélection simple est présentée ci-dessous.

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

Dans le code ci-dessus, conn est une connexion sqlite3 ouverte. À l'aide du curseur renvoyé par l'instruction d'exécution, vous pouvez parcourir la réponse de la table et récupérer les données de sélection requises.

Un exemple complet

Un exemple complet comprenant toutes les déclarations ci-dessus est donné ci-dessous.

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

Lorsque vous exécutez le programme ci-dessus, vous obtiendrez la sortie suivante.

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

Nous pouvons exécuter toutes les requêtes disponibles à l'aide de cette bibliothèque libsql. Alors, ne vous arrêtez pas avec ces exemples. Expérimentez diverses instructions de requête disponibles dans MySQL, SQLite3 et autres bases de données prises en charge dans Lua.