подготовленные операторы в 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