Lua勉強日記(6) LuaSql

次は、データベースです。当初は、Lua-Sqlite3 を使おうと思っていましたが、汎用的にデータベースにアクセスできそうな、LuaSqlを使ってみることにしました。これなら、アプリの規模が大きくなったときに、MySqlにしてクラスタリングとかという選択肢が残されると思います。

準備 LuaForgeからLuaSqlをダウンロードする

http://luaforge.net/frs/?group_id=12 (Luaに関するソフトウェアが集まっているLuaForgeというサイトがあるようです。残念ながら全てのプロジェクトが活発な訳ではなかったです。)

以下をダウンロード

http://luaforge.net/frs/download.php/2685/luasql-2.1.1-sqlite3-win32-lua51.zip

展開したところ、sqlite3.dllしか無いという潔さです。この中にLuaバインドも入っているのでしょうか?

インストールというか、DLLの配置

http://www.keplerproject.org/luasql/ にLuaSqlの情報がありましたので、ここを参考に動かしてみました。

実行のためのディレクトリ構成は以下のようになります。

カレントディレクトリ
│  lua5.1.dll
│  lua5.1.exe
│  sqlite_test.lua
│
└─luasql
sqlite3.dll

LuaSqlを使ってみる

取り敢えず、サンプルそのまま(sqlite3を指定するようには変更しましたが)で、動かしてみました。

sqlite_test.lua
require "luasql.sqlite3" -- これで、DLLを読み込めてしまうようです。
-- Environment Objectsを取得します。
env = assert (luasql.sqlite3())
-- コネクションを取得します。
-- connectメソッドの引数が、データベース名です。sqlite3では単なるファイル名です。
con = assert (env:connect("luasql-test.db"))
-- con:executeメソッドに、実行したいSQLを指定するだけで、
-- 更新系のSQLは実行できるようです。
res = assert (con:execute[[
  CREATE TABLE people(
    name  varchar(50),
    email varchar(50)
  )
]])
-- 挿入するデータの準備
list = {
{ name = "Jose das Couves", email = "jose@couves.com", },
{ name = "Manoel Joaquim", email = "manoel.joaquim@cafundo.com", },
{ name = "Maria das Dores", email = "maria@dores.com", },
}
for i, p in pairs (list) do
-- con:executeメソッドで、レコードを挿入する。
res = assert (con:execute(string.format([[
    INSERT INTO people
    VALUES ('%s', '%s')]], p.name, p.email)
))
end
-- カーソルを取得します。
cur = assert (con:execute"SELECT name, email from people")
-- cur:fetchメソッドで、SQL実行結果の最初の行を取得する。
row = cur:fetch ({}, "a")
while row do
print(string.format("Name: %s, E-mail: %s", row.name, row.email))
-- 前回取得したrowを指定して、次の行を取得する。
row = cur:fetch (row, "a")
end
-- 全部閉じる。
cur:close()
con:close()
env:close()
実行結果
C:\lua_example> lua5.1.exe sqlite_test.lua
Name: Jose das Couves, E-mail: jose@couves.com
Name: Manoel Joaquim, E-mail: manoel.joaquim@cafundo.com
Name: Maria das Dores, E-mail: maria@dores.com

実行後には、luasql-test.db という、SQLite3のデータベースファイルが作成されています。勿論、sqlite3コマンドで中身を見てもレコードが挿入されていることが確認できました。

C:\lua_example> sqlite3 luasql-test.db
SQLite version 3.5.7
Enter ".help" for instructions
sqlite> select * from people;
Jose das Couves|jose@couves.com
Manoel Joaquim|manoel.joaquim@cafundo.com
Maria das Dores|maria@dores.com
sqlite> .quit

本当に、呆れるくらい簡単にデータベースアクセスができてしまいました。もうちょっと紆余曲折があるかと思っていましたが、(何度も言います)呆れるくらいに簡単でした。トランザクションも、begin(); とcommit(); と rollback(); を更新系SQLとして実行してあげれば良さそうです。でも、このサンプルだと、SQLインジェクション対策がされていないので、実際のコードでは、もう少し考える必要がありそうです。

これで、データの永続化ができるようになったので、次は、Webサーバで動作させるために、CGIに挑戦してみます。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください