LuaSQLでPostgreSQLへODBC接続

結果は、惨敗だったのですが、記録しておきます。

Windowsで開発してるので、ライブラリの拡張子は、dllです。

luasql/postgres.dll

目的は、aipoのデータベースからユーザの情報を取ってこようとしたところから始まっています。

aipoのデータベースは、postgresqlなので、Luaから接続するには、LuaSQLのpostgresql用のバイナリをダウンロードしようとしました。しかし、http://luaforge.net/frs/?group_id=12 を見ると、LuaSQL 2.1.1 には、PostgreSQL用のバイナリがありません。物は試しということで、古いバイナリ(LuaSQL2.0.2)をダウンロードしてみましたが、requireした所で読み込みに失敗してしまいます。これは、元々ダウンロードしたファイル名にlua50が含まれてるから、Lua5.0用なのでしょう。なんで、Lua5.1では、PostgreSQL用のバイナリが無くなっちゃったんだろう?

luasql/odbc.dll

次に試したのは、ODBC接続です。Windows上で、システムDSNでデータベースへの接続を作成します。CGIから実行するので、システムDSNで作成する必要があります。(ユーザDSNで作成して嵌りました。)

require "luasql.odbc"
env = assert (luasql.odbc())
con = assert (env:connect('dbname', 'user', 'passwd'))
cur = assert (con:execute"select user_id from turbine_user")

動きました。

でも、↓のSQLだとだめでした。

cur = assert (con:execute"select user_id, last_name from turbine_user")

SQLをちょっと変更しただけなのに、odbc.dll内でエラーというかassertされてしまっているようです。どうも、select で文字列型のフィールドを指定すると、下のようなエラーが出るみたいです。

---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Assertion failed!
Program: c:\Kepler\1.1\bin\lua5.1.exe
File: src\ls_odbc.c
Line: 163
Expression: 0
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts
(Press Retry to debug the application - JIT must be enabled)
---------------------------
中止(A)   再試行(R)   無視(I)
---------------------------

src/ls_odbc.c を見てみても、結果のカラムの型判定で対応する型が無いというような場合にassert文が実行されるようです。Postgresのバージョンが新しすぎて、対応してない可能性もあるんですが、バグなのかどうかもわかりませんでした。Linuxなら大丈夫なのかな?Linuxで、luasql.postgres を使えるのが一番嬉しいんですが。

続く

コメントする

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


The reCAPTCHA verification period has expired. Please reload the page.

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