3

я не нашел способ вернуть данные из функции Postgres, которые возвращают таблицу:Использование SQLAlchemy как вызвать функцию, которая возвращает таблицу

CREATE OR REPLACE FUNCTION doc_codes(device_id TEXT) RETURNS TABLE("name" TEXT, "suffix" TEXT) AS $$ 
    SELECT name, prefix_fordevice(name, device_id) AS pf FROM doccode; 
$$ LANGUAGE SQL; 

Использование:

f = sq.sql.text("SELECT name, suffix FROM doc_codes(:deviceId)") 

    return self.con.execute(f, deviceId=deviceId) 

Или

f = sq.sql.func.doc_codes(deviceId, type_=types.String) 

    return self.con.execute(
     select([sq.Column('name', types.String), sq.Column('suffix', types.String)]). \ 
      select_from(f) 
    ).fetchall() 

Я получаю ошибку (ProgrammingError) a column definition list is required for functions returning "record".

Использование f = sq.sql.func.doc_code(deviceId, type_=types.String) Я получаю No function matches the given name and argument types. You might need to add explicit type casts и сгенерировано SQL is SELECT doc_code('1') AS doc_code_1, а не SELECT * FROM.

Если вы создаете таблицу, я не могу передать deviceId в имя таблицы ... теперь, что я могу сделать?

+0

Вы * уверен * вы определили вашу функцию как 'RETURNS TABLE (...)' 'не ВОЗВРАЩЕНИЕ SETOF RECORD'? –

+0

Damm, вот и все. Код в БД не был обновлен. Однако, как это сделать с помощью SET OF RECORD? – mamcx

ответ

1

Определение функции должно быть действительно RETURNS SETOF RECORD не RETURNS TABLE для получения этой ошибки.

Если вы на самом деле нужны, чтобы сделать это с RETURNS SETOF RECORD, вы должны вызвать его со списком столбца четкости, как сообщение об ошибке говорит: список определений

столбца требуется для функций возвращения «записи»

См. the documentation. Вы можете либо использовать OUT параметры (эквивалентных RETURNS TABLE), или позвоните по телефону с Col-списком, например:

SELECT name, suffix 
FROM doc_codes(:deviceId) AS dc("name" TEXT, "suffix" TEXT) 
Смежные вопросы