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

単純なデータ操作の場合、ファイルを使用する場合がありますが、これらのファイル操作が効率的、スケーラブル、および強力でない場合があります。この目的のために、データベースの使用に切り替えることがよくあります。LuaSQLは、Luaから多くのデータベース管理システムへのシンプルなインターフェースです。LuaSQLは、さまざまなタイプのSQLのサポートを提供するライブラリです。これには、

  • SQLite
  • Mysql
  • ODBC

このチュートリアルでは、LuaでのMySQLとSQLiteのデータベース処理について説明します。これは両方に汎用インターフェースを使用し、この実装を他のタイプのデータベースにも移植できるはずです。まず、MySQLで操作を実行する方法を見てみましょう。

MySQLデータベースのセットアップ

次の例を使用して期待どおりに機能させるには、データベースの初期設定が必要です。前提条件を以下に示します。

  • デフォルトのユーザーをroot、パスワードを「123456」としてMySQLをインストールおよびセットアップしました。

  • データベーステストを作成しました。

  • MySQLの基本を理解するためにMySQLチュートリアルを完了しました。

MySQLのインポート

シンプルなものが使えます require Luaの実装が正しく行われたと仮定してsqliteライブラリをインポートするステートメント。

mysql = require "luasql.mysql"

変数mysqlは、メインのmysqlテーブルを参照することによって関数へのアクセスを提供します。

接続の設定

MySQL環境を開始してから、その環境の接続を作成することで、接続をセットアップできます。以下に示します。

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')

上記の接続は、既存のMySQLファイルに接続し、新しく作成されたファイルとの接続を確立します。

関数の実行

作成、挿入、削除、更新などのすべてのdb操作を実行するのに役立つ接続で使用できる単純な実行関数があります。構文を以下に示します-

conn:execute([[ 'MySQLSTATEMENT' ]])

上記の構文では、connが開いていて、既存のMySQL接続があることを確認し、「MySQLSTATEMENT」を正しいステートメントに置き換える必要があります。

テーブルの作成例

簡単なテーブル作成の例を以下に示します。整数型のIDとvarchar型の名前の2つのパラメーターを持つテーブルを作成します。

mysql = require "luasql.mysql"

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')

print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample2 (id INTEGER, name TEXT);]])
print(status,errorString )

上記のプログラムを実行すると、サンプルという名前のテーブルが2つの列、つまりidとnameで作成されます。

MySQL environment (004BB178)	MySQL connection (004BE3C8)
0	nil

エラーが発生した場合は、nilではなくエラーステートメントが返されます。簡単なエラーステートメントを以下に示します。

LuaSQL: Error executing query. MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"id INTEGER, name TEXT)' at line 1

ステートメントの例を挿入

MySQLの挿入ステートメントを以下に示します。

conn:execute([[INSERT INTO sample values('11','Raj')]])

更新ステートメントの例

MySQLの更新ステートメントを以下に示します。

conn:execute([[UPDATE sample3 SET name='John' where id ='12']])

ステートメントの削除の例

MySQLの削除ステートメントを以下に示します。

conn:execute([[DELETE from sample3 where id ='12']])

ステートメントの例を選択

selectステートメントに関する限り、各行をループして必要なデータを抽出する必要があります。簡単なselectステートメントを以下に示します。

cursor,errorString = conn:execute([[select * from sample]])
row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   -- reusing the table of results
   row = cursor:fetch (row, "a")
end

上記のコードでは、connは開いているMySQL接続です。executeステートメントによって返されるカーソルを使用して、テーブルの応答をループし、必要な選択データをフェッチできます。

完全な例

上記のすべてのステートメントを含む完全な例を以下に示します。

mysql = require "luasql.mysql"

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample3 (id INTEGER, name TEXT)]])
print(status,errorString )

status,errorString = conn:execute([[INSERT INTO sample3 values('12','Raj')]])
print(status,errorString )

cursor,errorString = conn:execute([[select * from sample3]])
print(cursor,errorString)

row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   row = cursor:fetch (row, "a")
end

-- close everything
cursor:close()
conn:close()
env:close()

上記のプログラムを実行すると、次の出力が得られます。

MySQL environment (0037B178)	MySQL connection (0037EBA8)
0	nil
1	nil
MySQL cursor (003778A8)	nil
Id: 12, Name: Raj

トランザクションの実行

トランザクションは、データの整合性を保証するメカニズムです。トランザクションには、次の4つのプロパティが必要です-

  • Atomicity −トランザクションが完了するか、まったく何も起こりません。

  • Consistency −トランザクションは一貫性のある状態で開始し、システムを一貫性のある状態のままにする必要があります。

  • Isolation −トランザクションの中間結果は、現在のトランザクションの外部には表示されません。

  • Durability −トランザクションがコミットされると、システム障害が発生した後でも、影響は持続します。

トランザクションはSTARTTRANSACTIONで始まります。そして、commitまたはrollbackステートメントで終了します。

トランザクションを開始します

トランザクションを開始するには、connが開いているMySQL接続であると仮定して、Luaで次のステートメントを実行する必要があります。

conn:execute([[START TRANSACTION;]])

ロールバックトランザクション

開始トランザクションの実行後に行われた変更をロールバックするには、次のステートメントを実行する必要があります。

conn:execute([[ROLLBACK;]])

トランザクションのコミット

startトランザクションの実行後に行われた変更をコミットするには、次のステートメントを実行する必要があります。

conn:execute([[COMMIT;]])

上記でMySQLについて知っており、次のセクションでは基本的なSQL操作について説明します。トランザクションを覚えておいてください。ただし、SQLite3については再度説明しませんが、同じステートメントがSQLite3でも機能するはずです。

SQLiteのインポート

Luaの実装が正しく行われたと仮定して、単純なrequireステートメントを使用してSQLiteライブラリをインポートできます。インストール中に、データベース関連ファイルを含むフォルダーlibsql。

sqlite3 = require "luasql.sqlite3"

変数sqlite3は、メインのsqlite3テーブルを参照することで関数へのアクセスを提供します。

接続の設定

SQLite環境を開始してから、その環境の接続を作成することで、接続をセットアップできます。以下に示します。

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')

上記の接続は、既存のSQLiteファイルに接続するか、新しいSQLiteファイルを作成して、新しく作成されたファイルとの接続を確立します。

関数の実行

作成、挿入、削除、更新などのすべてのdb操作を実行するのに役立つ接続で使用できる単純な実行関数があります。構文を以下に示します-

conn:execute([[ 'SQLite3STATEMENT' ]])

上記の構文では、connが開いていて、既存のsqlite3接続があることを確認し、「SQLite3STATEMENT」を正しいステートメントに置き換える必要があります。

テーブルの作成例

簡単なテーブル作成の例を以下に示します。整数型のIDとvarchar型の名前の2つのパラメーターを持つテーブルを作成します。

sqlite3 = require "luasql.sqlite3"

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample ('id' INTEGER, 'name' TEXT)]])
print(status,errorString )

上記のプログラムを実行すると、サンプルという名前のテーブルが2つの列、つまりidとnameで作成されます。

SQLite3 environment (003EC918)	SQLite3 connection (00421F08)
0	nil

エラーの場合、nilではなくエラーステートメントが返されます。簡単なエラーステートメントを以下に示します。

LuaSQL: unrecognized token: ""'id' INTEGER, 'name' TEXT)"

ステートメントの例を挿入

SQLiteの挿入ステートメントを以下に示します。

conn:execute([[INSERT INTO sample values('11','Raj')]])

ステートメントの例を選択

selectステートメントに関する限り、各行をループして必要なデータを抽出する必要があります。簡単なselectステートメントを以下に示します。

cursor,errorString = conn:execute([[select * from sample]])
row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   -- reusing the table of results
   row = cursor:fetch (row, "a")
end

上記のコードでは、connは開いているsqlite3接続です。executeステートメントによって返されるカーソルを使用して、テーブルの応答をループし、必要な選択データをフェッチできます。

完全な例

上記のすべてのステートメントを含む完全な例を以下に示します。

sqlite3 = require "luasql.sqlite3"

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample ('id' INTEGER, 'name' TEXT)]])
print(status,errorString )

status,errorString = conn:execute([[INSERT INTO sample values('1','Raj')]])
print(status,errorString )

cursor,errorString = conn:execute([[select * from sample]])
print(cursor,errorString)

row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   row = cursor:fetch (row, "a")
end

-- close everything
cursor:close()
conn:close()
env:close()

上記のプログラムを実行すると、次の出力が得られます。

SQLite3 environment (005EC918)	SQLite3 connection (005E77B0)
0	nil
1	nil
SQLite3 cursor (005E9200)	nil
Id: 1, Name: Raj

このlibsqlライブラリを使用して、使用可能なすべてのクエリを実行できます。したがって、これらの例にとどまらないでください。LuaでそれぞれのMySQL、SQLite3、およびその他のサポートされているデータベースで使用可能なさまざまなクエリステートメントを試してください。