Lua-데이터베이스 액세스

간단한 데이터 작업의 경우 파일을 사용할 수 있지만 때로는 이러한 파일 작업이 효율적이고 확장 가능하며 강력하지 않을 수 있습니다. 이를 위해 우리는 종종 데이터베이스 사용으로 전환 할 수 있습니다. LuaSQL은 Lua에서 여러 데이터베이스 관리 시스템에 대한 간단한 인터페이스입니다. LuaSQL은 다양한 유형의 SQL을 지원하는 라이브러리입니다. 여기에는 다음이 포함됩니다.

  • SQLite
  • Mysql
  • ODBC

이 튜토리얼에서는 Lua에서 MySQL과 SQLite의 데이터베이스 처리를 다룰 것입니다. 이것은 두 가지 모두에 대한 일반 인터페이스를 사용하며이 구현을 다른 유형의 데이터베이스에도 이식 할 수 있어야합니다. 먼저 MySQL에서 작업을 수행하는 방법을 살펴 보겠습니다.

MySQL db 설정

다음 예제를 사용하여 예상대로 작동하려면 초기 db 설정이 필요합니다. 가정은 다음과 같습니다.

  • 기본 사용자는 루트로, 비밀번호는 '123456'으로 MySQL을 설치하고 설정했습니다.

  • 데이터베이스 테스트를 생성했습니다.

  • MySQL 기본 사항 을 이해하기 위해 MySQL 자습서를 살펴 보았습니다.

MySQL 가져 오기

우리는 간단한 require Lua 구현이 올바르게 수행되었다고 가정하고 sqlite 라이브러리를 가져 오는 문.

mysql = require "luasql.mysql"

mysql 변수는 기본 mysql 테이블을 참조하여 함수에 대한 액세스를 제공합니다.

연결 설정

MySQL 환경을 시작한 다음 환경에 대한 연결을 생성하여 연결을 설정할 수 있습니다. 아래와 같습니다.

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

위 연결은 기존 MySQL 파일에 연결하고 새로 생성 된 파일과 연결을 설정합니다.

기능 실행

생성, 삽입, 삭제, 업데이트 등의 모든 db 작업을 수행하는 데 도움이되는 연결과 함께 사용할 수있는 간단한 실행 함수가 있습니다. 구문은 다음과 같습니다.

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

위의 구문에서 conn이 열려 있고 기존 MySQL 연결이 있는지 확인하고 'MySQLSTATEMENT'를 올바른 문으로 대체해야합니다.

테이블 만들기 예제

간단한 테이블 생성 예제는 아래와 같습니다. 정수 유형의 두 매개 변수 ID와 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 )

위 프로그램을 실행하면 id와 name이라는 두 개의 컬럼이있는 sample이라는 테이블이 생성됩니다.

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

Insert 문 예

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 문 예

select 문에 관한 한 각 행을 반복하고 필요한 데이터를 추출해야합니다. 간단한 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

거래 수행

트랜잭션은 데이터 일관성을 보장하는 메커니즘입니다. 거래는 다음 네 가지 속성을 가져야합니다-

  • Atomicity − 거래가 완료되거나 아무 일도 일어나지 않습니다.

  • Consistency − 트랜잭션은 일관된 상태에서 시작하고 시스템을 일관된 상태로 유지해야합니다.

  • Isolation − 거래의 중간 결과는 현재 거래 외부에서 볼 수 없습니다.

  • Durability − 일단 트랜잭션이 커밋되면 시스템 장애 후에도 효과가 지속됩니다.

거래는 START TRANSACTION으로 시작됩니다. 커밋 또는 롤백 문으로 끝납니다.

거래 시작

트랜잭션을 시작하려면 conn이 열린 MySQL 연결이라고 가정하고 Lua에서 다음 문을 실행해야합니다.

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

롤백 트랜잭션

시작 트랜잭션이 실행 된 후 변경된 내용을 롤백하려면 다음 문을 실행해야합니다.

conn:execute([[ROLLBACK;]])

트랜잭션 커밋

시작 트랜잭션이 실행 된 후 변경된 내용을 커밋하려면 다음 문을 실행해야합니다.

conn:execute([[COMMIT;]])

위의 MySQL에 대해 알고 있으며 다음 섹션에서는 기본 SQL 작업에 대해 설명합니다. 트랜잭션을 기억하십시오. SQLite3에 대해 다시 설명하지는 않지만 SQLite3에서도 동일한 명령문이 작동해야합니다.

SQLite 가져 오기

Lua 구현이 올바르게 수행되었다고 가정하고 간단한 require 문을 사용하여 SQLite 라이브러리를 가져올 수 있습니다. 설치 중에 데이터베이스 관련 파일이 포함 된 libsql 폴더.

sqlite3 = require "luasql.sqlite3"

sqlite3 변수는 기본 sqlite3 테이블을 참조하여 함수에 대한 액세스를 제공합니다.

연결 설정

SQLite 환경을 시작한 다음 환경에 대한 연결을 생성하여 연결을 설정할 수 있습니다. 아래와 같습니다.

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

위의 연결은 기존 SQLite 파일에 연결하거나 새 SQLite 파일을 생성하고 새로 생성 된 파일과의 연결을 설정합니다.

기능 실행

생성, 삽입, 삭제, 업데이트 등의 모든 db 작업을 수행하는 데 도움이되는 연결과 함께 사용할 수있는 간단한 실행 함수가 있습니다. 구문은 다음과 같습니다.

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

위의 구문에서 conn이 열려 있고 기존 sqlite3 연결인지 확인하고 'SQLite3STATEMENT'를 올바른 문으로 대체해야합니다.

테이블 만들기 예제

간단한 테이블 생성 예제는 아래와 같습니다. 정수 유형의 두 매개 변수 ID와 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 )

위 프로그램을 실행하면 id와 name이라는 두 개의 컬럼이있는 sample이라는 테이블이 생성됩니다.

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

오류가 발생하면 nil 대신 오류 문이 반환됩니다. 다음은 간단한 오류 설명입니다.

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

Insert 문 예

SQLite에 대한 삽입 문은 다음과 같습니다.

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

Select 문 예

select 문에 관한 한 각 행을 반복하고 필요한 데이터를 추출해야합니다. 간단한 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에서 지원되는 기타 db에서 사용할 수있는 다양한 쿼리 문을 실험합니다.