Lua - 데이터베이스 접근

안녕하세요, 열망하는 프로그래머 여러분! 오늘 우리는 Lua를 사용한 데이터베이스 접근의 흥미로운 여정을 시작하려고 합니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 이 모험을 단계별로 안내해드리겠습니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요 - 우리는 기본부터 시작하고 점진적으로 올라갈 것입니다. 그러니 가상의 안전帽을 쓰고, 데이터에 손을 대보세요!

Lua - Database Access

MySQL db 설정

Lua에서 데이터베이스를 시작하기 전에 우리는 놀이 공간을 설정해야 합니다. 이는 요리하기 전에 주방을 준비하는 것과 같은 것입니다. 우리의 경우, MySQL을 데이터베이스 관리 시스템으로 사용할 것입니다.

  1. 먼저, 컴퓨터에 MySQL이 설치되어 있는지 확인하세요. 설치되어 있지 않다면 MySQL 웹사이트로 이동하여 운영 체제에 맞는 적절한 버전을 다운로드하세요.

  2. 설치가 완료되면, 우리의 실험을 위한 새로운 데이터베이스를 만들어보세요. MySQL 명령어 라인이나 MySQL Workbench와 같은 그래픽 도구를 사용할 수 있습니다.

CREATE DATABASE lua_test;

좋아요! 이제 우리의 샌드박스가 Lua 마법을 위한 준비가 완료되었습니다.

MySQL 导入

Lua에서 MySQL을 사용하려면 LuaSQL이라는 특별한 도구가 필요합니다. 이는 Lua와 MySQL 간의 통역자 역할을 합니다. 다음과 같이导入하겠습니다:

local luasql = require "luasql.mysql"

이 줄은 Lua에게 "MySQL 능력을 이 작업에 필요로 한다"고 말하는 것과 같습니다.

연결 설정

이제 Lua와 MySQL을 소개했으므로, 연결을 설정해보겠습니다. 이는 데이터베이스에 전화号码를 돌리는 것과 같은 것입니다:

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

이 작업에서는 다음과 같은 일이 일어납니다:

  • MySQL 환경(env)을 만듭니다.
  • 이 환경을 사용하여 데이터베이스에 연결을 합니다. 데이터베이스 이름, 사용자 이름, 비밀번호, 호스트, 포트를 제공합니다.

실행 함수

실행 함수는 데이터베이스에 명령을 보내는 우리의 방법입니다. 이는 식당에서 웨이터가 우리의 주문을 받는 것과 같은 것입니다:

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 열을 포함합니다.

삽입 문 예제

이제 우리의 도서관에 몇 권의 책을 추가해보겠습니다:

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

이 명령은 우리의 테이블에 책을 추가합니다. 이는 도서관 카드를 작성하는 것과 같습니다.

갱신 문 예제

아이고! 우리는 실수를 했습니다. 책의 출판 연도를 갱신해보겠습니다:

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

이 명령은 우리의 책의 출판 연도를 수정합니다.

삭제 문 예제

이제 우리의 도서관에서 책을 제거해보겠습니다:

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

이 명령은 지정된 책을 우리의 테이블에서 제거합니다.

선택 문 예제

이제 우리의 도서관에 있는 책들을 확인해보겠습니다:

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

이 명령은 모든 책을 검색하고 그 자세한 정보를 인쇄합니다.

완전한 예제

이제 모든 것을 하나의 완전한 예제로 모아보겠습니다:

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

-- 테이블 생성
execute(con, [[
CREATE TABLE IF NOT EXISTS books (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100),
author VARCHAR(50),
year INT
)
]])

-- 책 추가
execute(con, [[
INSERT INTO books (title, author, year)
VALUES ('The Lua Programming Language', 'Roberto Ierusalimschy', 2017)
]])

-- 모든 책 선택 및 인쇄
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()

이 스크립트는 테이블을 생성하고, 책을 추가한 후 모든 책을 인쇄합니다.

트랜잭션 수행

트랜잭션은 데이터베이스 연산의 보호 층과 같습니다. 모든 연산이 성공하거나 아무 연산도 성공하지 않도록 합니다. 이는 "전부 또는 아무 것도 아님" 접근 방식입니다.

트랜잭션 시작

트랜잭션을 시작하려면:

con:execute("START TRANSACTION")

트랜잭션 롤백

무언가 잘못되면 모든 변경 사항을 되돌립니다:

con:execute("ROLLBACK")

트랜잭션 커밋

모든 것이 잘되었다면 모든 변경 사항을 저장합니다:

con:execute("COMMIT")

SQLite 导入

SQLite는 특히 작은 애플리케이션에 인기가 많은 다른 데이터베이스 시스템입니다. Lua에서 SQLite를 사용하는 방법을 보겠습니다:

local luasql = require "luasql.sqlite3"

연결 설정

SQLite와의 연결은 MySQL과 약간 다릅니다:

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

이는 "test.db"라는 파일을 생성하거나 열어 데이터베이스로 사용합니다.

실행 함수

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)

삽입 문 예제

이제 우리의 테이블에 사용자를 추가해보겠습니다:

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

선택 문 예제

이제 우리의 사용자를 검색해보겠습니다:

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

-- 테이블 생성
execute(con, [[
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
)
]])

-- 사용자 추가
execute(con, [[
INSERT INTO users (name, age)
VALUES ('Alice', 30)
]])

-- 모든 사용자 선택 및 인쇄
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()

이 스크립트는 테이블을 생성하고, 사용자를 추가한 후 모든 사용자를 인쇄합니다.

그리고 여러분! Lua를 사용한 데이터베이스 접근의 첫 걸음을 냈습니다. 연습이 완벽을 만든다고 기억하세요, 그러니 이 예제들로 실험을 두려워하지 마세요. 누가 다음 큰 데이터베이스 드라이베이스 애플리케이션을 만들까요? 행복하게 코딩하세요!

Credits: Image by storyset