Учебники

Lua — доступ к базе данных

Для простых операций с данными мы можем использовать файлы, но иногда эти файловые операции могут быть неэффективными, масштабируемыми и мощными. Для этого мы можем часто переходить на использование баз данных. LuaSQL — это простой интерфейс от Lua к ряду систем управления базами данных. LuaSQL — это библиотека, которая обеспечивает поддержку различных типов SQL. Это включает в себя,

  • SQLite
  • Mysql
  • ODBC

В этом уроке мы рассмотрим обработку базы данных MySQL и SQLite на Lua. Он использует общий интерфейс для обоих и должен иметь возможность портировать эту реализацию на другие типы баз данных. Сначала давайте посмотрим, как вы можете делать операции в MySQL.

Настройка базы данных MySQL

Чтобы использовать следующие примеры для правильной работы, нам нужна начальная настройка БД. Допущения перечислены ниже.

  • Вы установили и настроили MySQL с пользователем по умолчанию в качестве пользователя root и паролем «123456».

  • Вы создали тест базы данных.

  • Вы прошли учебник по MySQL, чтобы понять основы MySQL.

Вы установили и настроили MySQL с пользователем по умолчанию в качестве пользователя root и паролем «123456».

Вы создали тест базы данных.

Вы прошли учебник по MySQL, чтобы понять основы MySQL.

Импорт MySQL

Мы можем использовать простой оператор require для импорта библиотеки sqlite, предполагая, что ваша реализация Lua была выполнена правильно.

mysql = require "luasql.mysql"

Переменная mysql предоставит доступ к функциям, ссылаясь на основную таблицу mysql.

Настройка подключения

Мы можем установить соединение, инициируя среду MySQL, а затем создавая соединение для среды. Это показано ниже.

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

Вышеуказанное соединение подключится к существующему файлу MySQL и установит соединение с вновь созданным файлом.

Выполнить функцию

В соединении есть простая функция execute, которая поможет нам выполнить все операции с базами данных: создание, вставка, удаление, обновление и так далее. Синтаксис показан ниже —

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

В приведенном выше синтаксисе мы должны убедиться, что conn открыта и существует соединение MySQL, и заменить MySQLSTATEMENT на правильное выражение.

Пример создания таблицы

Простой пример создания таблицы показан ниже. Создает таблицу с двумя параметрами id типа integer и именем типа 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 )

Когда вы запустите вышеупомянутую программу, будет создана таблица с именем sample с двумя столбцами, а именно id и name.

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

В случае какой-либо ошибки вам будет возвращено сообщение об ошибке вместо nil. Простое сообщение об ошибке показано ниже.

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

Пример вставки выписки

Оператор вставки для MySQL показан ниже.

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

Пример обновления оператора

Заявление об обновлении для MySQL показано ниже.

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

Пример удаления выписки

Оператор удаления для MySQL показан ниже.

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

Выберите пример выписки

Что касается оператора 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

В приведенном выше коде conn является открытым MySQL-соединением. С помощью курсора, возвращаемого оператором execute, вы можете перебрать ответ таблицы и получить необходимые данные выбора.

Полный пример

Полный пример, включающий все приведенные выше утверждения, приведен ниже.

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

Когда вы запустите вышеуказанную программу, вы получите следующий вывод.

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

Выполнение транзакций

Транзакции — это механизм, который обеспечивает согласованность данных. Транзакции должны иметь следующие четыре свойства —

  • Атомарность — либо транзакция завершена, либо ничего не происходит вообще.

  • Согласованность — транзакция должна начинаться в согласованном состоянии и оставлять систему в согласованном состоянии.

  • Изоляция — промежуточные результаты транзакции не видны за пределами текущей транзакции.

  • Долговечность — после совершения транзакции последствия сохраняются даже после сбоя системы.

Атомарность — либо транзакция завершена, либо ничего не происходит вообще.

Согласованность — транзакция должна начинаться в согласованном состоянии и оставлять систему в согласованном состоянии.

Изоляция — промежуточные результаты транзакции не видны за пределами текущей транзакции.

Долговечность — после совершения транзакции последствия сохраняются даже после сбоя системы.

Транзакция начинается с START TRANSACTION; и заканчивается оператором commit или rollback.

Начать транзакцию

Чтобы инициировать транзакцию, нам нужно выполнить следующую инструкцию в Lua, предполагая, что conn является открытым MySQL-соединением.

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

Откат транзакции

Нам нужно выполнить следующую инструкцию, чтобы откатить изменения, сделанные после запуска транзакции.

conn:execute([[ROLLBACK;]])

Совершить транзакцию

Нам нужно выполнить следующую инструкцию, чтобы зафиксировать изменения, сделанные после запуска транзакции.

conn:execute([[COMMIT;]])

Мы знали о MySQL из приведенного выше, а следующий раздел объясняет основные операции SQL. Запомните транзакции, хотя они не объяснены снова для SQLite3, но те же операторы должны работать и для SQLite3.

Импорт SQLite

Мы можем использовать простой оператор require для импорта библиотеки SQLite, предполагая, что ваша реализация Lua была выполнена правильно. Во время установки, папка libsql, которая содержит файлы, связанные с базой данных.

sqlite3 = require "luasql.sqlite3"

Переменная sqlite3 предоставит доступ к функциям, ссылаясь на основную таблицу sqlite3.

Настройка подключения

Мы можем установить соединение, запустив среду SQLite, а затем создав соединение для этой среды. Это показано ниже.

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

Вышеуказанное соединение подключится к существующему файлу SQLite или создаст новый файл SQLite и установит соединение с вновь созданным файлом.

Выполнить функцию

В соединении есть простая функция execute, которая поможет нам выполнить все операции с базами данных: создание, вставка, удаление, обновление и так далее. Синтаксис показан ниже —

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

В приведенном выше синтаксисе мы должны убедиться, что conn открыта и существует соединение sqlite3, и заменить SQLite3STATEMENT на правильное выражение.

Пример создания таблицы

Простой пример создания таблицы показан ниже. Создает таблицу с двумя параметрами id типа integer и именем типа 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 )

Когда вы запустите вышеупомянутую программу, будет создана таблица с именем sample с двумя столбцами, а именно id и name.

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

В случае ошибки вы получите сообщение об ошибке вместо nil. Простое сообщение об ошибке показано ниже.

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

Пример вставки выписки

Оператор вставки для SQLite показан ниже.

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

Выберите пример выписки

Что касается оператора 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

В приведенном выше коде conn является открытым соединением sqlite3. С помощью курсора, возвращаемого оператором execute, вы можете перебрать ответ таблицы и получить необходимые данные выбора.

Полный пример

Полный пример, включающий все приведенные выше утверждения, приведен ниже.

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

Когда вы запустите вышеуказанную программу, вы получите следующий вывод.

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

Мы можем выполнить все доступные запросы с помощью этой библиотеки libsql. Поэтому, пожалуйста, не останавливайтесь на этих примерах. Поэкспериментируйте различные операторы запросов, доступные в соответствующих MySQL, SQLite3 и других поддерживаемых БД в Lua.