0

ここにある luasql でプリペアド ステートメントを使用する例に従おうとしています: http://lists.luaforge.net/pipermail/kepler-project/2008-January/002207.html

luasql バージョン 2.2.0 がインストールされています。

サンプル コードを試すと、次のエラー メッセージが表示されます。

lua: postgrestest.lua:63: メソッド 'gettypes' (nil 値) を呼び出そうとしています スタック トレースバック: postgrestest.lua:63: メイン チャンク内 [C]: ?

コードは次のとおりです。

require "luasql.postgres"
local databasename = "test"
local databaseUser = "user"
local databasepassword = "password"
local databaseserver="10.10.10.10" -- only rqd for remote database servers.
--local databaseserver="127.0.0.1"
local databaseport = 5432 -- only rqd for remote database servers.

env = assert (luasql.postgres())
con = assert (env:connect(databasename, databaseUser, databasepassword, databaseserver))

-- DROP ANY EXISTING PEOPLE TABLE
-- note:  con:execute() Returns: a cursor object if there are results, or the number of rows affected by the command otherwise.
res = con:execute("DROP TABLE people")

-- RECREATE PEOPLE TABLE
res = assert (con:execute[[
    CREATE TABLE people(
        id integer,
        fname text,
        lname text,
        job text
    )
]])
print ('result from create table is:'..res)
-- ADD SOME PEOPLE TO THE PEOPLE TABLE
res = assert(con:execute("INSERT INTO people " ..
    "VALUES (1, 'Roberto', 'Ierusalimschy', 'Programmer')"), "record inserted")
print ("result from insert"..res)

res = assert(con:execute("INSERT INTO people " ..
    "VALUES (3, 'Taylor', 'Swift', 'Singer')"))

-- RETRIEVE THE PEOPLE TABLE SORTED BY LAST NAME INTO CURSOR
cur = assert (con:execute"SELECT * from people order by lname")

-- LOOP THROUGH THE CURSOR AND PRINT
print()
print(string.format("%15s  %-15s %-15s %-15s",
    "#", "FNAME", "LNAME", "JOB"))
print(string.format("%15s  %-15s %-15s %-15s",
    "-", "-----", "-----", "---"))
row = cur:fetch ({}, "a")
while row do
    print(string.format("%15d  %-15s %-15s %-15s",
        row.id, row.fname, row.lname, row.job))
    row = cur:fetch (row, "a")
end
print()

-- prepared statements 
types = con:gettypes()
stmt, err = con:prepare("select * from people where lname=$1", types["text"])
if err then
    print("problems creating prepared statement"..err)
else
    cur, err = stmt:execute("Swift")
  if err then
        print("Couldn't execute the statement: "..err);
    else
        results = cur:fetch({}, "a")
        while results do
            print(results.id)
        end
    end
end 
-- CLOSE EVERYTHING
cur:close()
con:close()
env:close()

また、prepare ステートメントを次のように変更しようとしました。

--types = con:gettypes()
--stmt, err = con:prepare("select * from people where lname=$1", types["text"])
stmt, err = con:prepare("select * from people where lname=$1", "Swift")
if err then
    print("problems creating prepared statement"..err)
else
    --cur, err = stmt:execute("Swift")
    cur, err = stmt:execute()
  if err then
        print("Couldn't execute the statement: "..err);

しかし、prepare メソッドを除いて、同じエラー メッセージが表示されます。

lua: postgrestest.lua:65: attempt to call method 'prepare' (a nil value)
stack traceback:
        postgrestest.lua:65: in main chunk
        [C]: ?

私が間違っていること/これをトラブルシューティングする方法を教えてもらえますか? ありがとう!

編集1

データベースへの接続と他のすべてのコードが機能します。テーブルをループしてデータを出力するコードは機能します。

ありがとう。

4

1 に答える 1

2

コメントに記載されているように、明らかに持っていないパッチを適用する必要があります。ただし、準備済みステートメントをサポートする言語フレームワークの外部で使用する必要がある場合は、PostgreSQL のサーバー側の準備済みステートメントを手動で使用できます。

基本的に、SQL でストアド プロシージャを宣言し、関数と同じように SQL で呼び出します。準備済みステートメントは、一時的な SQL 言語関数のようなものです。したがって、任意の SQL インターフェイスを介して、次のようなことを行うことができます。

PREPARE my_insert(int, int, text, text) AS
INSERT INTO foo(id, bar, baz, test)
values ($1, $2, $3, $4);

次に、(同じプランで) 繰り返し呼び出すことができます。

EXECUTE my_insert(1, 3, 'foo', 'bar');

これにより、クライアント側のフレームワークがサポートしていない場合でも、そのような準備済みステートメントを実行できます。

于 2013-05-29T08:03:19.750 に答える