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

Здравствуйте, стремящиеся к знаниям программисты! Сегодня мы отправляемся в увлекательное путешествие в мир доступа к базам данных с использованием Lua. Как ваш добрый сосед по компьютерным наукам, я здесь, чтобы провести вас через это приключение шаг за шагом. Не волнуйтесь, если вы новички в программировании - мы начнем с азов и постепенно продвинемся дальше. Так что надевайте свои виртуальные каски, и давайте окунемся в данные!

Lua - Database Access

Настройка MySQL db

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

  1. Сначала убедитесь, что у вас установлен MySQL на вашем компьютере. Если нет, перейдите на сайт MySQL и скачайте подходящую версию для вашей операционной системы.

  2. Once installed, create a new database for our experiments. You can do this using the MySQL command line or a graphical tool like MySQL Workbench.

CREATE DATABASE lua_test;

Отлично! Теперь у нас готова песочница для магии Lua.

Импорт MySQL

Чтобы использовать MySQL с Lua, нам needed special tool called LuaSQL. It's like a translator that helps Lua talk to MySQL. Let's import it:

local luasql = require "luasql.mysql"

Эта строка как будто бы говорит Lua: "Эй, нам понадобятся твои навыки работы с MySQL для этой задачи!"

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

Теперь, когда мы представили Lua MySQL, давайте установим соединение. Это как набирать телефонный номер, чтобы дозвониться до нашей базы данных:

local env = luasql.mysql()
local con = env:connect("lua_test", "username", "password", "localhost", 3306)

Вот что происходит:

  • Мы создаем среду (env) для MySQL.
  • Мы используем эту среду, чтобы подключиться к нашей базе данных, указывая имя базы данных, имя пользователя, пароль, хост и порт.

Функция execute

Функция execute - это наш способ отправки команд в базу данных. Это как официант, который принимает наш заказ в ресторане:

function execute(con, sql)
local cur = con:execute(sql)
if cur then
return cur:fetch()
end
return nil
end

Эта функция принимает наше подключение и SQL-команду, выполняет ее и возвращает результат.

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

Давайте создадим нашу первую таблицу! Представьте, что мы строим простую библиотечную систему:

local sql = [[
CREATE TABLE books (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100),
author VARCHAR(50),
year INT
)
]]
execute(con, sql)

Это создает таблицу с именем 'books' и столбцами id, title, author и year.

Пример Insert-запроса

Теперь добавим несколько книг в нашу библиотеку:

local sql = [[
INSERT INTO books (title, author, year)
VALUES ('The Lua Programming Language', 'Roberto Ierusalimschy', 2016)
]]
execute(con, sql)

Это добавляет книгу в нашу таблицу. Это как заполнение библиотечной карточки для новой книги.

Пример Update-запроса

Ой! Мы совершили ошибку. Давайте исправим год нашей книги:

local sql = [[
UPDATE books
SET year = 2017
WHERE title = 'The Lua Programming Language'
]]
execute(con, sql)

Это исправляет год издания нашей книги.

Пример Delete-запроса

Давайте удалим книгу из нашей библиотеки:

local sql = [[
DELETE FROM books
WHERE title = 'The Lua Programming Language'
]]
execute(con, sql)

Это удаляет указанную книгу из нашей таблицы.

Пример Select-запроса

Теперь давайте посмотрим, какие книги у нас есть в библиотеке:

local sql = "SELECT * FROM books"
local cur = con:execute(sql)
local row = cur:fetch({}, "a")
while row do
print(string.format("%s by %s (%d)", row.title, row.author, row.year))
row = cur:fetch(row, "a")
end

Это retrieve все книги и выводит их детали.

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

Давайте объединим все в один полный пример:

local luasql = require "luasql.mysql"

local env = luasql.mysql()
local con = env:connect("lua_test", "username", "password", "localhost", 3306)

function execute(con, sql)
local cur = con:execute(sql)
if cur then
return cur:fetch()
end
return nil
end

-- Create table
execute(con, [[
CREATE TABLE IF NOT EXISTS books (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100),
author VARCHAR(50),
year INT
)
]])

-- Insert a book
execute(con, [[
INSERT INTO books (title, author, year)
VALUES ('The Lua Programming Language', 'Roberto Ierusalimschy', 2017)
]])

-- Select and print all books
local cur = con:execute("SELECT * FROM books")
local row = cur:fetch({}, "a")
while row do
print(string.format("%s by %s (%d)", row.title, row.author, row.year))
row = cur:fetch(row, "a")
end

con:close()
env:close()

Этот скрипт создает таблицу, вставляет книгу и затем выводит все книги в таблице.

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

Транзакции как защитные пузыри вокруг серии операций с базой данных. Они обеспечивают, чтобы либо все операции succeeded, либо none из них. Это как "все или ничего" подход.

Начало транзакции

Чтобы начать транзакцию:

con:execute("START TRANSACTION")

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

Если что-то пошло не так, мы можем отменить все изменения:

con:execute("ROLLBACK")

Fixed Commit Transaction

Если все прошло хорошо, мы можем сохранить все изменения:

con:execute("COMMIT")

Импорт SQLite

SQLite - другая популярная система управления базами данных, особенно для небольших приложений. Давайте посмотрим, как использовать ее с Lua:

local luasql = require "luasql.sqlite3"

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

Подключение к SQLite немного отличается от MySQL:

local env = luasql.sqlite3()
local con = env:connect("test.db")

Это создает или открывает файл с именем "test.db" в качестве нашей базы данных.

Функция execute

Функция execute для SQLite аналогична MySQL:

function execute(con, sql)
local cur = con:execute(sql)
if cur then
return cur:fetch()
end
return nil
end

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

Давайте создадим простую таблицу в SQLite:

local sql = [[
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
)
]]
execute(con, sql)

Пример Insert-запроса

Теперь добавим пользователя:

local sql = [[
INSERT INTO users (name, age)
VALUES ('Alice', 30)
]]
execute(con, sql)

Пример Select-запроса

Давайте retrieve наших пользователей:

local sql = "SELECT * FROM users"
local cur = con:execute(sql)
local row = cur:fetch({}, "a")
while row do
print(string.format("%s is %d years old", row.name, row.age))
row = cur:fetch(row, "a")
end

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

Вот полный пример использования SQLite:

local luasql = require "luasql.sqlite3"

local env = luasql.sqlite3()
local con = env:connect("test.db")

function execute(con, sql)
local cur = con:execute(sql)
if cur then
return cur:fetch()
end
return nil
end

-- Create table
execute(con, [[
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
)
]])

-- Insert a user
execute(con, [[
INSERT INTO users (name, age)
VALUES ('Alice', 30)
]])

-- Select and print all users
local cur = con:execute("SELECT * FROM users")
local row = cur:fetch({}, "a")
while row do
print(string.format("%s is %d years old", row.name, row.age))
row = cur:fetch(row, "a")
end

con:close()
env:close()

Этот скрипт создает таблицу, вставляет пользователя и затем выводит всех пользователей в таблице.

И вот оно,folks! Вы только что сделали свои первые шаги в мир доступа к базам данных с использованием Lua. Помните, что практика makes perfect, так что не бойтесь экспериментировать с этими примерами. Кто знает? Вы можете создать следующее большое приложение с базой данных! Счастливого кодирования!

Credits: Image by storyset