Как вернуть читаемый результат из функции Postgres от SQLAlchemy? - PullRequest
0 голосов
/ 06 декабря 2018

Я вызываю функцию Postgres из Flask-SQLAlchemy.Функция возвращает таблицу с 2 значениями: строка и число:

CREATE OR REPLACE FUNCTION public.test (
  id varchar
)
RETURNS TABLE (
  project_name varchar,
  projects_num integer
) AS
$body$
DECLARE 
BEGIN    
...
RETURN QUERY (SELECT project.name as project_name, project_nums as projects_num);   
END;
$body$
LANGUAGE 'plpgsql'

На стороне колбы я делаю следующий вызов:

engine = create_engine(url)
connection = engine.connect()
result = connection.execute('SELECT "test"(\'123\')').fetchone()

Затем я пытаюсь получитьданные из результата.

for row in result:
    print(literal_eval(row))

Это вызывает исключение, потому что на самом деле строка имеет строку:

(my_project, 3)

И, конечно же, она не знает, что это за черт my_project.Как заставить его возвращать результаты правильно или обрабатывать их правильно?Например, он может вернуть ('my_project', 3)

Я решил эту проблему, добавил скобки

('"' || account_object.valid_status || '"')

Но это выглядит ужасно и не могу поверить, что нет нормального способа решения?Еще одна проблема с Null - он просто не включен в кортеж: (,0) - как с этим справиться?

1 Ответ

0 голосов
/ 07 декабря 2018

Строковое значение является представлением составного значения (строки) Postgresql, и поэтому явно не предназначено для оценки как литерала Python.Psycopg2 может обрабатывать и адаптировать значения составного типа к значениям Python, но для этого необходимо использовать созданный тип.В вашем случае простое решение состоит в том, чтобы выбрать из табличной функции вместо использования ее в качестве элемента списка выбора:

result = connection.execute('SELECT * FROM "test"(\'123\')').fetchone()
print(result.project_name, result.projects_num)
...