Lua - Truy cập cơ sở dữ liệu

Đối với các hoạt động dữ liệu đơn giản, chúng tôi có thể sử dụng tệp, nhưng đôi khi, các hoạt động tệp này có thể không hiệu quả, không thể mở rộng và mạnh mẽ. Với mục đích này, chúng tôi có thể thường chuyển sang sử dụng cơ sở dữ liệu. LuaSQL là một giao diện đơn giản từ Lua đến một số hệ quản trị cơ sở dữ liệu. LuaSQL là thư viện, cung cấp hỗ trợ cho các loại SQL khác nhau. Điều này bao gồm,

  • SQLite
  • Mysql
  • ODBC

Trong hướng dẫn này, chúng tôi sẽ đề cập đến việc xử lý cơ sở dữ liệu MySQL một SQLite trong Lua. Điều này sử dụng một giao diện chung cho cả hai và nên có thể chuyển việc triển khai này sang các loại cơ sở dữ liệu khác. Trước tiên, hãy xem cách bạn có thể thực hiện các hoạt động trong MySQL.

Thiết lập db MySQL

Để sử dụng các ví dụ sau hoạt động như mong đợi, chúng ta cần thiết lập db ban đầu. Các giả định được liệt kê dưới đây.

  • Bạn đã cài đặt và thiết lập MySQL với người dùng mặc định là root và mật khẩu là '123456'.

  • Bạn đã tạo một bài kiểm tra cơ sở dữ liệu.

  • Bạn đã xem qua hướng dẫn MySQL để hiểu Cơ bản về MySQL.

Nhập MySQL

Chúng ta có thể sử dụng một require để nhập thư viện sqlite giả sử rằng việc triển khai Lua của bạn đã được thực hiện chính xác.

mysql = require "luasql.mysql"

Biến mysql sẽ cung cấp quyền truy cập vào các chức năng bằng cách tham chiếu đến bảng mysql chính.

Thiết lập kết nối

Chúng ta có thể thiết lập kết nối bằng cách khởi tạo môi trường MySQL và sau đó tạo kết nối cho môi trường. Nó được hiển thị bên dưới.

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

Kết nối trên sẽ kết nối với tệp MySQL hiện có và thiết lập kết nối với tệp mới tạo.

Thực thi chức năng

Có một chức năng thực thi đơn giản có sẵn với kết nối sẽ giúp chúng ta thực hiện tất cả các thao tác db từ tạo, chèn, xóa, cập nhật, v.v. Cú pháp được hiển thị bên dưới -

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

Trong cú pháp trên, chúng ta cần đảm bảo rằng conn đang mở và kết nối MySQL hiện có và thay thế 'MySQLSTATEMENT' bằng câu lệnh chính xác.

Ví dụ về Tạo bảng

Dưới đây là một ví dụ tạo bảng đơn giản. Nó tạo một bảng với hai tham số id kiểu số nguyên và tên kiểu 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 )

Khi bạn chạy chương trình trên, một bảng có tên sample sẽ được tạo với hai cột là id và name.

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

Trong trường hợp có bất kỳ lỗi nào, bạn sẽ được trả về một câu lệnh lỗi thay vì nil. Một báo cáo lỗi đơn giản được hiển thị bên dưới.

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

Chèn ví dụ câu lệnh

Một câu lệnh chèn cho MySQL được hiển thị bên dưới.

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

Ví dụ về câu lệnh cập nhật

Một câu lệnh cập nhật cho MySQL được hiển thị bên dưới.

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

Ví dụ về Xóa câu lệnh

Một câu lệnh xóa cho MySQL được hiển thị bên dưới.

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

Chọn ví dụ về câu lệnh

Liên quan đến câu lệnh select, chúng ta cần lặp qua từng hàng và trích xuất dữ liệu cần thiết. Một câu lệnh chọn đơn giản được hiển thị bên dưới.

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

Trong đoạn mã trên, conn là một kết nối MySQL mở. Với sự trợ giúp của con trỏ được trả về bởi câu lệnh thực thi, bạn có thể lặp qua phản hồi bảng và tìm nạp dữ liệu chọn được yêu cầu.

Một ví dụ hoàn chỉnh

Dưới đây là một ví dụ hoàn chỉnh bao gồm tất cả các câu trên.

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

Khi bạn chạy chương trình trên, bạn sẽ nhận được kết quả sau.

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

Thực hiện giao dịch

Giao dịch là một cơ chế đảm bảo tính nhất quán của dữ liệu. Các giao dịch phải có bốn thuộc tính sau:

  • Atomicity - Giao dịch hoàn tất hoặc không có gì xảy ra.

  • Consistency - Một giao dịch phải bắt đầu ở trạng thái nhất quán và để hệ thống ở trạng thái nhất quán.

  • Isolation - Kết quả trung gian của một giao dịch không được hiển thị bên ngoài giao dịch hiện tại.

  • Durability - Sau khi giao dịch được cam kết, các tác động sẽ tồn tại dai dẳng, ngay cả sau khi hệ thống bị lỗi.

Giao dịch bắt đầu bằng BẮT ĐẦU GIAO DỊCH; và kết thúc bằng câu lệnh commit hoặc rollback.

Bắt đầu giao dịch

Để bắt đầu một giao dịch, chúng ta cần thực hiện câu lệnh sau trong Lua, giả sử conn là một kết nối MySQL mở.

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

Giao dịch hồi phục

Chúng ta cần thực hiện câu lệnh sau để khôi phục các thay đổi được thực hiện sau khi bắt đầu giao dịch được thực hiện.

conn:execute([[ROLLBACK;]])

Giao dịch cam kết

Chúng ta cần thực hiện câu lệnh sau để cam kết các thay đổi được thực hiện sau khi giao dịch bắt đầu được thực hiện.

conn:execute([[COMMIT;]])

Chúng ta đã biết về MySQL trong phần trên và phần sau giải thích về các phép toán SQL cơ bản. Hãy nhớ các giao dịch, mặc dù không được giải thích lại cho SQLite3 nhưng các câu lệnh tương tự cũng sẽ hoạt động cho SQLite3.

Nhập SQLite

Chúng ta có thể sử dụng một câu lệnh request đơn giản để nhập thư viện SQLite với giả định rằng việc triển khai Lua của bạn đã được thực hiện chính xác. Trong khi cài đặt, một thư mục libsql có chứa các tệp liên quan đến cơ sở dữ liệu.

sqlite3 = require "luasql.sqlite3"

Biến sqlite3 sẽ cung cấp quyền truy cập vào các chức năng bằng cách tham chiếu đến bảng sqlite3 chính.

Thiết lập kết nối

Chúng ta có thể thiết lập kết nối bằng cách khởi tạo môi trường SQLite và sau đó tạo kết nối cho môi trường. Nó được hiển thị bên dưới.

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

Kết nối trên sẽ kết nối với tệp SQLite hiện có hoặc tạo tệp SQLite mới và thiết lập kết nối với tệp mới tạo.

Thực thi chức năng

Có một chức năng thực thi đơn giản có sẵn với kết nối sẽ giúp chúng ta thực hiện tất cả các thao tác db từ tạo, chèn, xóa, cập nhật, v.v. Cú pháp được hiển thị bên dưới -

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

Trong cú pháp trên, chúng ta cần đảm bảo rằng conn đang mở và kết nối sqlite3 hiện có và thay thế 'SQLite3STATEMENT' bằng câu lệnh chính xác.

Ví dụ về Tạo bảng

Dưới đây là một ví dụ tạo bảng đơn giản. Nó tạo một bảng với hai tham số id kiểu số nguyên và tên kiểu 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 )

Khi bạn chạy chương trình trên, một bảng có tên sample sẽ được tạo với hai cột là id và name.

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

Trong trường hợp có lỗi, bạn sẽ được trả về một câu lệnh lỗi thay vì nil. Một báo cáo lỗi đơn giản được hiển thị bên dưới.

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

Chèn ví dụ câu lệnh

Một câu lệnh chèn cho SQLite được hiển thị bên dưới.

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

Chọn ví dụ về câu lệnh

Liên quan đến câu lệnh select, chúng ta cần lặp qua từng hàng và trích xuất dữ liệu cần thiết. Một câu lệnh chọn đơn giản được hiển thị bên dưới.

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

Trong đoạn mã trên, conn là một kết nối sqlite3 mở. Với sự trợ giúp của con trỏ được trả về bởi câu lệnh thực thi, bạn có thể lặp qua phản hồi bảng và tìm nạp dữ liệu chọn được yêu cầu.

Một ví dụ hoàn chỉnh

Dưới đây là một ví dụ hoàn chỉnh bao gồm tất cả các câu trên.

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

Khi bạn chạy chương trình trên, bạn sẽ nhận được kết quả sau.

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

Chúng tôi có thể thực hiện tất cả các truy vấn có sẵn với sự trợ giúp của thư viện libsql này. Vì vậy, xin đừng dừng lại với những ví dụ này. Thử nghiệm các câu lệnh truy vấn khác nhau có sẵn trong MySQL, SQLite3 tương ứng và các db được hỗ trợ khác trong Lua.