Lua - データベースアクセス

こんにちは、将来のプログラマーたち!今日は、Luaを用いたデータベースアクセスの世界に興味深い旅に出発しましょう。あなたの近所の親切なコンピュータサイエンスの先生として、私はこの冒険をステップバイステップでガイドします。プログラミングが初めての方也不用担心——基本から始めて、少しずつ進んでいきます。では、仮想のヘルメットをかぶり、データに掘り込んでいきましょう!

Lua - Database Access

MySQL データベースの設定

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に「Hey、このタスクにはあなたの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で使用する方法を見てみましょう:

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