Lua - Acceso a la base de datos
Para operaciones de datos simples, podemos usar archivos, pero, a veces, estas operaciones de archivo pueden no ser eficientes, escalables y poderosas. Para este propósito, a menudo podemos cambiar al uso de bases de datos. LuaSQL es una interfaz simple de Lua a varios sistemas de administración de bases de datos. LuaSQL es la biblioteca que brinda soporte para diferentes tipos de SQL. Esto incluye,
- SQLite
- Mysql
- ODBC
En este tutorial, cubriremos el manejo de bases de datos de MySQL y SQLite en Lua. Esto utiliza una interfaz genérica para ambos y también debería ser posible portar esta implementación a otros tipos de bases de datos. Primero veamos cómo puede realizar las operaciones en MySQL.
Configuración de MySQL db
Para que los siguientes ejemplos funcionen como se esperaba, necesitamos la configuración inicial de la base de datos. Los supuestos se enumeran a continuación.
Ha instalado y configurado MySQL con el usuario predeterminado como root y la contraseña como '123456'.
Ha creado una prueba de base de datos.
Ha seguido el tutorial de MySQL para comprender los conceptos básicos de MySQL.
Importando MySQL
Podemos usar un simple require declaración para importar la biblioteca sqlite asumiendo que su implementación de Lua se realizó correctamente.
mysql = require "luasql.mysql"
La variable mysql proporcionará acceso a las funciones haciendo referencia a la tabla principal de mysql.
Configurar conexión
Podemos configurar la conexión iniciando un entorno MySQL y luego creando una conexión para el entorno. Se muestra a continuación.
local env = mysql.mysql()
local conn = env:connect('test','root','123456')
La conexión anterior se conectará a un archivo MySQL existente y establecerá la conexión con el archivo recién creado.
Ejecutar función
Hay una función de ejecución simple disponible con la conexión que nos ayudará a hacer todas las operaciones de la base de datos desde crear, insertar, eliminar, actualizar, etc. La sintaxis se muestra a continuación:
conn:execute([[ 'MySQLSTATEMENT' ]])
En la sintaxis anterior, debemos asegurarnos de que conn esté abierta y que exista una conexión MySQL y reemplazar 'MySQLSTATEMENT' con la declaración correcta.
Ejemplo de creación de tabla
A continuación se muestra un ejemplo simple de creación de tabla. Crea una tabla con dos parámetros id de tipo integer y nombre de 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 )
Cuando ejecute el programa anterior, se creará una tabla llamada muestra con dos columnas, a saber, id y nombre.
MySQL environment (004BB178) MySQL connection (004BE3C8)
0 nil
En caso de que haya algún error, se le devolverá una declaración de error en lugar de nil. A continuación se muestra una simple declaración de error.
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
Insertar ejemplo de declaración
A continuación se muestra una declaración de inserción para MySQL.
conn:execute([[INSERT INTO sample values('11','Raj')]])
Ejemplo de declaración de actualización
A continuación, se muestra una declaración de actualización para MySQL.
conn:execute([[UPDATE sample3 SET name='John' where id ='12']])
Eliminar ejemplo de declaración
A continuación se muestra una declaración de eliminación para MySQL.
conn:execute([[DELETE from sample3 where id ='12']])
Seleccionar ejemplo de declaración
En lo que respecta a la declaración de selección, necesitamos recorrer cada una de las filas y extraer los datos necesarios. A continuación se muestra una simple declaración de selección.
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
En el código anterior, conn es una conexión MySQL abierta. Con la ayuda del cursor devuelto por la instrucción de ejecución, puede recorrer la respuesta de la tabla y obtener los datos de selección necesarios.
Un ejemplo completo
A continuación se ofrece un ejemplo completo que incluye todas las declaraciones anteriores.
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()
Cuando ejecute el programa anterior, obtendrá el siguiente resultado.
MySQL environment (0037B178) MySQL connection (0037EBA8)
0 nil
1 nil
MySQL cursor (003778A8) nil
Id: 12, Name: Raj
Realización de transacciones
Las transacciones son un mecanismo que garantiza la coherencia de los datos. Las transacciones deben tener las siguientes cuatro propiedades:
Atomicity - O se completa una transacción o no ocurre nada.
Consistency - Una transacción debe comenzar en un estado consistente y dejar el sistema en un estado consistente.
Isolation - Los resultados intermedios de una transacción no son visibles fuera de la transacción actual.
Durability - Una vez que se ha comprometido una transacción, los efectos son persistentes, incluso después de una falla del sistema.
La transacción comienza con INICIAR TRANSACCIÓN; y termina con una declaración de compromiso o reversión.
Iniciar transacción
Para iniciar una transacción, necesitamos ejecutar la siguiente declaración en Lua, asumiendo que conn es una conexión MySQL abierta.
conn:execute([[START TRANSACTION;]])
Transacción de reversión
Necesitamos ejecutar la siguiente declaración para revertir los cambios realizados después de que se ejecuta la transacción de inicio.
conn:execute([[ROLLBACK;]])
Confirmar transacción
Necesitamos ejecutar la siguiente declaración para confirmar los cambios realizados después de que se ejecute la transacción de inicio.
conn:execute([[COMMIT;]])
Hemos conocido sobre MySQL en la sección anterior y la siguiente explica las operaciones básicas de SQL. Recuerde las transacciones, aunque no se explican nuevamente para SQLite3, pero las mismas declaraciones deberían funcionar para SQLite3 también.
Importando SQLite
Podemos usar una declaración require simple para importar la biblioteca SQLite asumiendo que su implementación de Lua se realizó correctamente. Durante la instalación, una carpeta libsql que contiene los archivos relacionados con la base de datos.
sqlite3 = require "luasql.sqlite3"
La variable sqlite3 proporcionará acceso a las funciones haciendo referencia a la tabla principal sqlite3.
Configuración de la conexión
Podemos configurar la conexión iniciando un entorno SQLite y luego creando una conexión para el entorno. Se muestra a continuación.
local env = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
La conexión anterior se conectará a un archivo SQLite existente o creará un nuevo archivo SQLite y establecerá la conexión con el archivo recién creado.
Ejecutar función
Hay una función de ejecución simple disponible con la conexión que nos ayudará a hacer todas las operaciones de la base de datos desde crear, insertar, eliminar, actualizar, etc. La sintaxis se muestra a continuación:
conn:execute([[ 'SQLite3STATEMENT' ]])
En la sintaxis anterior, debemos asegurarnos de que conn esté abierto y que exista una conexión sqlite3 y reemplazar 'SQLite3STATEMENT' con la declaración correcta.
Ejemplo de creación de tabla
A continuación se muestra un ejemplo simple de creación de tabla. Crea una tabla con dos parámetros id de tipo integer y nombre de 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 )
Cuando ejecute el programa anterior, se creará una tabla llamada muestra con dos columnas, a saber, id y nombre.
SQLite3 environment (003EC918) SQLite3 connection (00421F08)
0 nil
En caso de error, se le devolverá una declaración de error en lugar de nil. A continuación se muestra una simple declaración de error.
LuaSQL: unrecognized token: ""'id' INTEGER, 'name' TEXT)"
Insertar ejemplo de declaración
A continuación se muestra una declaración de inserción para SQLite.
conn:execute([[INSERT INTO sample values('11','Raj')]])
Seleccionar ejemplo de declaración
En lo que respecta a la declaración de selección, necesitamos recorrer cada una de las filas y extraer los datos necesarios. A continuación se muestra una simple declaración de selección.
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
En el código anterior, conn es una conexión sqlite3 abierta. Con la ayuda del cursor devuelto por la instrucción de ejecución, puede recorrer la respuesta de la tabla y obtener los datos de selección necesarios.
Un ejemplo completo
A continuación se ofrece un ejemplo completo que incluye todas las declaraciones anteriores.
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()
Cuando ejecute el programa anterior, obtendrá el siguiente resultado.
SQLite3 environment (005EC918) SQLite3 connection (005E77B0)
0 nil
1 nil
SQLite3 cursor (005E9200) nil
Id: 1, Name: Raj
Podemos ejecutar todas las consultas disponibles con la ayuda de esta biblioteca libsql. Por lo tanto, no se detenga con estos ejemplos. Experimente varias declaraciones de consulta disponibles en MySQL, SQLite3 y otras bases de datos compatibles en Lua.