С функцией pgsql SelRec(integer), как определено ниже:

-- select record
CREATE OR REPLACE FUNCTION SelRec(_sno integer)
  RETURNS SETOF app_for_leave AS
$BODY$
    BEGIN
    RETURN QUERY
        SELECT * FROM "app_for_leave" WHERE "sno"=_sno;
    END
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Я пытался вызвать эту функцию внутри своего кода на python и ожидал, что возвращаемый результат будет в виде объекта запроса, который, кроме того, мог бы получить индивидуальное значение внутри объекта запроса.

import psycopg2

connection_string = 'postgresql://postgres:111111@localhost:5432/myDB'

conn = psycopg2.connect(connection_string)
cursor = conn.cursor()

obj = cursor.execute("select * from SelRec(1)");

conn.commit()

print obj # None

Тем не менее, результат равен None, как будто нет сохраненных данных, но он существует, как показано ниже:

 sno | eid | ename |     sd     |     ed     | sid | status 
-----+-----+-------+------------+------------+-----+--------
   1 | 101 |       | 2013-04-04 | 2013-04-04 |   2 | f

Мне нужно, чтобы obj возвращал объект запроса, который я бы далее назвал DataSet = obj.first() и DataSet.status, ect для каждого отдельного значения.

Любое предложение, как я могу этого достичь? Благодарю.

0
Houy Narun 16 Сен 2018 в 06:12

2 ответа

Лучший ответ

Я думаю, что это может быть ожидаемое поведение.

Из документов http://initd.org/psycopg/docs/cursor.html # cursor.execute

Метод возвращает None. Если запрос был выполнен, возвращаемые значения могут быть получены с помощью методов fetch * ().

Попробуйте что-то вроде:

print(dir(obj), type(obj))
print(cursor.fetchall())
1
jmunsch 16 Сен 2018 в 04:29

Я думаю, что вы должны попробовать запрос, приведенный ниже. Так же вы хотите вернуть множество строк.

select * from SelRec(1) as result (sno int, eid int, ename varchar, sd data_type, ed data_type, sid int, status boolean)
0
Bharti Mohane 16 Сен 2018 в 07:47