Lua - dostęp do bazy danych
W przypadku prostych operacji na danych możemy używać plików, ale czasami te operacje na plikach mogą nie być wydajne, skalowalne i wydajne. W tym celu często możemy przejść na korzystanie z baz danych. LuaSQL to prosty interfejs od Lua do wielu systemów zarządzania bazami danych. LuaSQL to biblioteka, która zapewnia obsługę różnych typów SQL. Obejmuje to:
- SQLite
- Mysql
- ODBC
W tym samouczku zajmiemy się obsługą baz danych MySQL i SQLite w Lua. Używa to ogólnego interfejsu dla obu i powinno być możliwe przeniesienie tej implementacji również do innych typów baz danych. Najpierw zobaczmy, jak możesz wykonywać operacje w MySQL.
Konfiguracja bazy MySQL
Aby poniższe przykłady działały zgodnie z oczekiwaniami, potrzebujemy wstępnej konfiguracji bazy danych. Założenia są wymienione poniżej.
Zainstalowałeś i skonfigurowałeś MySQL z domyślnym użytkownikiem jako root i hasłem jako '123456'.
Utworzyłeś test bazy danych.
Przeszedłeś przez samouczek MySQL, aby zrozumieć podstawy MySQL.
Importowanie MySQL
Możemy użyć prostego require instrukcja do zaimportowania biblioteki sqlite przy założeniu, że implementacja Lua została wykonana poprawnie.
mysql = require "luasql.mysql"
Zmienna mysql zapewni dostęp do funkcji poprzez odwołanie się do głównej tabeli mysql.
Konfigurowanie połączenia
Połączenie możemy zestawić inicjując środowisko MySQL, a następnie tworząc połączenie dla tego środowiska. Jest to pokazane poniżej.
local env = mysql.mysql()
local conn = env:connect('test','root','123456')
Powyższe połączenie połączy się z istniejącym plikiem MySQL i ustanowi połączenie z nowo utworzonym plikiem.
Wykonaj funkcję
Z połączeniem dostępna jest prosta funkcja wykonywania, która pomoże nam wykonać wszystkie operacje bazy danych, od tworzenia, wstawiania, usuwania, aktualizowania i tak dalej. Składnia jest pokazana poniżej -
conn:execute([[ 'MySQLSTATEMENT' ]])
W powyższej składni musimy upewnić się, że conn jest otwarte i istnieje połączenie MySQL i zastąpić „MySQLSTATEMENT” poprawną instrukcją.
Utwórz przykład tabeli
Poniżej pokazano prosty przykład tworzenia tabeli. Tworzy tabelę z dwoma parametrami id typu integer i nazwą typu 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 )
Po uruchomieniu powyższego programu zostanie utworzona tabela o nazwie sample z dwiema kolumnami, a mianowicie id i name.
MySQL environment (004BB178) MySQL connection (004BE3C8)
0 nil
W przypadku wystąpienia błędu, zamiast zera zostanie zwrócona instrukcja błędu. Poniżej przedstawiono proste stwierdzenie błędu.
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
Wstaw przykład instrukcji
Poniżej pokazano instrukcję wstawiania dla MySQL.
conn:execute([[INSERT INTO sample values('11','Raj')]])
Przykład instrukcji aktualizacji
Poniżej przedstawiono instrukcję aktualizacji MySQL.
conn:execute([[UPDATE sample3 SET name='John' where id ='12']])
Przykład instrukcji usuwania
Poniżej przedstawiono instrukcję usuwania MySQL.
conn:execute([[DELETE from sample3 where id ='12']])
Przykład instrukcji Select
Jeśli chodzi o instrukcję select, musimy przejść przez każdy z wierszy i wyodrębnić wymagane dane. Poniżej przedstawiono prostą instrukcję 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
W powyższym kodzie conn jest otwartym połączeniem MySQL. Za pomocą kursora zwróconego przez instrukcję execute można przejrzeć w pętli odpowiedź tabeli i pobrać wymagane dane wyboru.
Kompletny przykład
Pełny przykład zawierający wszystkie powyższe stwierdzenia podano poniżej.
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()
Po uruchomieniu powyższego programu otrzymasz następujące dane wyjściowe.
MySQL environment (0037B178) MySQL connection (0037EBA8)
0 nil
1 nil
MySQL cursor (003778A8) nil
Id: 12, Name: Raj
Wykonywanie transakcji
Transakcje to mechanizm zapewniający spójność danych. Transakcje powinny mieć następujące cztery właściwości -
Atomicity - Albo transakcja zostaje zakończona, albo nic się nie dzieje.
Consistency - Transakcja musi rozpocząć się w stanie zgodnym i pozostawić system w stanie zgodnym.
Isolation - Pośrednie wyniki transakcji nie są widoczne poza bieżącą transakcją.
Durability - Po zatwierdzeniu transakcji efekty są trwałe, nawet po awarii systemu.
Transakcja rozpoczyna się od STARTU TRANSAKCJI; i kończy się instrukcją commit lub rollback.
Rozpocznij transakcję
Aby zainicjować transakcję, musimy wykonać następującą instrukcję w Lua, zakładając, że conn jest otwartym połączeniem MySQL.
conn:execute([[START TRANSACTION;]])
Transakcja wycofania
Musimy wykonać następującą instrukcję, aby cofnąć zmiany wprowadzone po wykonaniu transakcji startowej.
conn:execute([[ROLLBACK;]])
Zatwierdź transakcję
Aby zatwierdzić zmiany wprowadzone po wykonaniu transakcji startowej, musimy wykonać następującą instrukcję.
conn:execute([[COMMIT;]])
Wiedzieliśmy o MySQL w powyższej sekcji, a następna sekcja wyjaśnia podstawowe operacje SQL. Zapamiętaj transakcje, choć nie zostały one ponownie wyjaśnione dla SQLite3, ale te same instrukcje powinny działać również dla SQLite3.
Importowanie SQLite
Możemy użyć prostej instrukcji wymagania, aby zaimportować bibliotekę SQLite, zakładając, że Twoja implementacja Lua została wykonana poprawnie. Podczas instalacji folder libsql zawierający pliki związane z bazą danych.
sqlite3 = require "luasql.sqlite3"
Zmienna sqlite3 zapewni dostęp do funkcji poprzez odwołanie się do głównej tabeli sqlite3.
Konfigurowanie połączenia
Połączenie możemy zestawić inicjując środowisko SQLite, a następnie tworząc połączenie dla tego środowiska. Jest to pokazane poniżej.
local env = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
Powyższe połączenie połączy się z istniejącym plikiem SQLite lub utworzy nowy plik SQLite i ustanowi połączenie z nowo utworzonym plikiem.
Wykonaj funkcję
Z połączeniem dostępna jest prosta funkcja wykonywania, która pomoże nam wykonać wszystkie operacje bazy danych, od tworzenia, wstawiania, usuwania, aktualizowania i tak dalej. Składnia jest pokazana poniżej -
conn:execute([[ 'SQLite3STATEMENT' ]])
W powyższej składni musimy upewnić się, że conn jest otwarte i istnieje połączenie sqlite3 i zamienić 'SQLite3STATEMENT' na poprawną instrukcję.
Utwórz przykład tabeli
Poniżej pokazano prosty przykład tworzenia tabeli. Tworzy tabelę z dwoma parametrami id typu integer i nazwą typu 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 )
Po uruchomieniu powyższego programu zostanie utworzona tabela o nazwie sample z dwiema kolumnami, a mianowicie id i name.
SQLite3 environment (003EC918) SQLite3 connection (00421F08)
0 nil
W przypadku błędu zamiast zera zostanie zwrócona instrukcja błędu. Poniżej przedstawiono proste stwierdzenie błędu.
LuaSQL: unrecognized token: ""'id' INTEGER, 'name' TEXT)"
Wstaw przykład instrukcji
Poniżej pokazano instrukcję wstawiania dla programu SQLite.
conn:execute([[INSERT INTO sample values('11','Raj')]])
Przykład instrukcji Select
Jeśli chodzi o instrukcję select, musimy przejść przez każdy z wierszy i wyodrębnić wymagane dane. Poniżej przedstawiono prostą instrukcję 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
W powyższym kodzie conn jest otwartym połączeniem sqlite3. Za pomocą kursora zwróconego przez instrukcję execute można przejrzeć w pętli odpowiedź tabeli i pobrać wymagane dane wyboru.
Kompletny przykład
Pełny przykład zawierający wszystkie powyższe stwierdzenia podano poniżej.
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()
Po uruchomieniu powyższego programu otrzymasz następujące dane wyjściowe.
SQLite3 environment (005EC918) SQLite3 connection (005E77B0)
0 nil
1 nil
SQLite3 cursor (005E9200) nil
Id: 1, Name: Raj
Z pomocą tej biblioteki libsql możemy wykonać wszystkie dostępne zapytania. Dlatego nie poprzestawaj na tych przykładach. Eksperymentuj z różnymi instrukcjami zapytania dostępnymi w odpowiednich MySQL, SQLite3 i innych obsługiwanych bazach danych w Lua.