Lua - Acesso ao Banco de Dados
Para operações de dados simples, podemos usar arquivos, mas, às vezes, essas operações de arquivo podem não ser eficientes, escalonáveis e poderosas. Para este propósito, podemos frequentemente mudar para o uso de bancos de dados. LuaSQL é uma interface simples de Lua para vários sistemas de gerenciamento de banco de dados. LuaSQL é a biblioteca que fornece suporte para diferentes tipos de SQL. Isso inclui,
- SQLite
- Mysql
- ODBC
Neste tutorial, cobriremos o manuseio de banco de dados MySQL e SQLite em Lua. Isso usa uma interface genérica para ambos e deve ser possível portar essa implementação para outros tipos de bancos de dados também. Primeiro, vamos ver como você pode fazer as operações no MySQL.
Configuração de banco de dados MySQL
Para usar os exemplos a seguir para funcionar conforme o esperado, precisamos da configuração inicial do banco de dados. As premissas estão listadas abaixo.
Você instalou e configurou o MySQL com usuário padrão como root e senha como '123456'.
Você criou um teste de banco de dados.
Você passou pelo tutorial do MySQL para entender os fundamentos do MySQL.
Importando MySQL
Podemos usar um simples require declaração para importar a biblioteca sqlite assumindo que sua implementação Lua foi feita corretamente.
mysql = require "luasql.mysql"
A variável mysql fornecerá acesso às funções referindo-se à tabela principal do mysql.
Configurando a conexão
Podemos configurar a conexão iniciando um ambiente MySQL e, em seguida, criando uma conexão para o ambiente. É mostrado abaixo.
local env = mysql.mysql()
local conn = env:connect('test','root','123456')
A conexão acima se conectará a um arquivo MySQL existente e estabelecerá a conexão com o arquivo recém-criado.
Função de execução
Há uma função simples de execução disponível com a conexão que nos ajudará a fazer todas as operações de banco de dados de criar, inserir, excluir, atualizar e assim por diante. A sintaxe é mostrada abaixo -
conn:execute([[ 'MySQLSTATEMENT' ]])
Na sintaxe acima, precisamos garantir que conn está aberto e uma conexão MySQL existente e substituir o 'MySQLSTATEMENT' pela instrução correta.
Criar Exemplo de Tabela
Um exemplo simples de criação de tabela é mostrado abaixo. Ele cria uma tabela com dois parâmetros id do tipo inteiro e nome do 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 você executa o programa acima, uma tabela chamada sample é criada com duas colunas, id e name.
MySQL environment (004BB178) MySQL connection (004BE3C8)
0 nil
Caso haja algum erro, você receberá uma declaração de erro em vez de nil. Uma declaração de erro simples é mostrada abaixo.
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
Exemplo de Inserção de Declaração
Uma instrução de inserção para o MySQL é mostrada abaixo.
conn:execute([[INSERT INTO sample values('11','Raj')]])
Exemplo de declaração de atualização
Uma instrução de atualização para o MySQL é mostrada abaixo.
conn:execute([[UPDATE sample3 SET name='John' where id ='12']])
Excluir Exemplo de Declaração
Uma instrução delete para MySQL é mostrada abaixo.
conn:execute([[DELETE from sample3 where id ='12']])
Selecione Exemplo de Declaração
No que diz respeito à instrução select, precisamos percorrer cada uma das linhas e extrair os dados necessários. Uma declaração simples de seleção é mostrada abaixo.
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
No código acima, conn é uma conexão MySQL aberta. Com a ajuda do cursor retornado pela instrução execute, você pode percorrer a resposta da tabela e buscar os dados de seleção necessários.
Um Exemplo Completo
Um exemplo completo incluindo todas as afirmações acima é fornecido abaixo.
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()
Ao executar o programa acima, você obterá a seguinte saída.
MySQL environment (0037B178) MySQL connection (0037EBA8)
0 nil
1 nil
MySQL cursor (003778A8) nil
Id: 12, Name: Raj
Realizando transações
As transações são um mecanismo que garante a consistência dos dados. As transações devem ter as seguintes quatro propriedades -
Atomicity - Ou uma transação é concluída ou nada acontece.
Consistency - Uma transação deve começar em um estado consistente e deixar o sistema em um estado consistente.
Isolation - Os resultados intermediários de uma transação não são visíveis fora da transação atual.
Durability - Depois que uma transação foi confirmada, os efeitos são persistentes, mesmo após uma falha do sistema.
A transação começa com START TRANSACTION; e termina com a instrução de confirmação ou reversão.
Iniciar transação
Para iniciar uma transação, precisamos executar a seguinte instrução em Lua, assumindo que conn é uma conexão MySQL aberta.
conn:execute([[START TRANSACTION;]])
Transação de reversão
Precisamos executar a seguinte instrução para reverter as alterações feitas após a execução da transação inicial.
conn:execute([[ROLLBACK;]])
Commit Transaction
Precisamos executar a seguinte instrução para confirmar as alterações feitas após a execução da transação inicial.
conn:execute([[COMMIT;]])
Sabemos sobre o MySQL na seção acima e a seguir explica sobre as operações SQL básicas. Lembre-se de transações, embora não explicadas novamente para SQLite3, mas as mesmas instruções devem funcionar para SQLite3 também.
Importando SQLite
Podemos usar uma instrução require simples para importar a biblioteca SQLite assumindo que sua implementação Lua foi feita corretamente. Durante a instalação, uma pasta libsql que contém os arquivos relacionados ao banco de dados.
sqlite3 = require "luasql.sqlite3"
A variável sqlite3 fornecerá acesso às funções referindo-se à tabela sqlite3 principal.
Configurando a conexão
Podemos configurar a conexão iniciando um ambiente SQLite e, em seguida, criando uma conexão para o ambiente. É mostrado abaixo.
local env = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
A conexão acima se conectará a um arquivo SQLite existente ou criará um novo arquivo SQLite e estabelecerá a conexão com o arquivo recém-criado.
Função de execução
Há uma função simples de execução disponível com a conexão que nos ajudará a fazer todas as operações de banco de dados de criar, inserir, excluir, atualizar e assim por diante. A sintaxe é mostrada abaixo -
conn:execute([[ 'SQLite3STATEMENT' ]])
Na sintaxe acima, precisamos garantir que conn está aberto e a conexão sqlite3 existente e substituir 'SQLite3STATEMENT' pela instrução correta.
Criar Exemplo de Tabela
Um exemplo simples de criação de tabela é mostrado abaixo. Ele cria uma tabela com dois parâmetros id do tipo inteiro e nome do 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 você executa o programa acima, uma tabela chamada sample é criada com duas colunas, id e name.
SQLite3 environment (003EC918) SQLite3 connection (00421F08)
0 nil
Em caso de erro, você receberá uma instrução de erro em vez de nulo. Uma declaração de erro simples é mostrada abaixo.
LuaSQL: unrecognized token: ""'id' INTEGER, 'name' TEXT)"
Exemplo de Inserção de Declaração
Uma instrução insert para SQLite é mostrada abaixo.
conn:execute([[INSERT INTO sample values('11','Raj')]])
Selecione Exemplo de Declaração
No que diz respeito à instrução select, precisamos percorrer cada uma das linhas e extrair os dados necessários. Uma declaração simples de seleção é mostrada abaixo.
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
No código acima, conn é uma conexão sqlite3 aberta. Com a ajuda do cursor retornado pela instrução execute, você pode percorrer a resposta da tabela e buscar os dados de seleção necessários.
Um Exemplo Completo
Um exemplo completo incluindo todas as afirmações acima é fornecido abaixo.
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()
Ao executar o programa acima, você obterá a seguinte saída.
SQLite3 environment (005EC918) SQLite3 connection (005E77B0)
0 nil
1 nil
SQLite3 cursor (005E9200) nil
Id: 1, Name: Raj
Podemos executar todas as consultas disponíveis com a ajuda desta biblioteca libsql. Então, por favor, não pare com esses exemplos. Experimente várias instruções de consulta disponíveis no respectivo MySQL, SQLite3 e outros bancos de dados suportados em Lua.