Lua - Доступ к базе данных
Здравствуйте, стремящиеся к знаниям программисты! Сегодня мы отправляемся в увлекательное путешествие в мир доступа к базам данных с использованием Lua. Как ваш добрый сосед по компьютерным наукам, я здесь, чтобы провести вас через это приключение шаг за шагом. Не волнуйтесь, если вы новички в программировании - мы начнем с азов и постепенно продвинемся дальше. Так что надевайте свои виртуальные каски, и давайте окунемся в данные!
Настройка MySQL db
Прежде чем мы сможем поиграть с базами данных в Lua, нам нужно настроить нашу игровую площадку. Представьте это как подготовку кухни перед готовкой вкусного блюда. В нашем случае мы будем использовать MySQL в качестве системы управления базами данных.
-
Сначала убедитесь, что у вас установлен MySQL на вашем компьютере. Если нет, перейдите на сайт MySQL и скачайте подходящую версию для вашей операционной системы.
-
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