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