подготвени изрази в luasql.postgres

Опитвам се да следвам примера за използване на подготвени изрази в luasql, намерен тук: http://lists.luaforge.net/pipermail/kepler-project/2008-January/002207.html

Имам инсталиран luasql версия 2.2.0.

Когато изпробвам примерния код, получавам следното съобщение за грешка:

lua: postgrestest.lua:63: опит за извикване на метод 'gettypes' (нулева стойност) проследяване на стека: 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()

Също така се опитах да променя израза за подготовка, за да изглежда така:

--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);

Но получавам същото съобщение за грешка, освен с метода за подготовка:

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

Можете ли да ми кажете какво правя погрешно/как да отстраня това? Благодаря!

РЕДАКТИРАНЕ 1

Връзката с базата данни и целият друг код работи. Кодът, който преминава през таблицата и отпечатва данните, работи.

Благодаря.


person dot    schedule 23.04.2013    source източник
comment
Изглежда, че не получавате връзка.   -  person Clodoaldo Neto    schedule 23.04.2013
comment
Получавам връзка, защото всички инструкции за печат, които добавям, за да покажа таблицата, която току-що създадох, работят. Ще актуализирам публикацията си, за да включа това   -  person dot    schedule 23.04.2013
comment
Сигурни ли сте, че сте поставили пластира правилно? Струва ми се, че се провалихте през това време.   -  person hjpotter92    schedule 24.04.2013
comment
да... предположих, че корекцията е включена в най-новата версия на luasql... но предполагам, че не е така.   -  person dot    schedule 25.04.2013


Отговори (1)


Както е отбелязано в коментарите, трябва да приложите корекция, която очевидно нямате. Въпреки това, ако трябва да използвате подготвени изрази извън езикова рамка, която ги поддържа, можете да използвате ръчно подготвените оператори на 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');

Това ви позволява да правите такива подготвени отчети, дори ако вашата рамка от страна на клиента не ги поддържа.

person Chris Travers    schedule 29.05.2013