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に挑戦してみます。