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 peopleVALUES ('%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 doprint(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に挑戦してみます。