Получение нескольких курсоров, возвращаемых функцией postgresql, из Django

Я новичок в django и не могу понять, возможно ли получить несколько курсоров, возвращаемых функцией postgresql.

Edit: для возврата нескольких курсоров из функции postgresql:

CREATE FUNCTION function_name(parameters) RETURNS SETOF refcursor... 

Далее в теле функции:

OPEN cursor1

RETURN NEXT cursor1;

OPEN cursor2 
    
RETURN NEXT cursor2;

RETURN:

Я ищу в сети уже несколько часов и не смог найти ни одного примера.

Я планирую писать сырой sql из django (без ORM) для вызова функций postgresql.

Кто-нибудь просветит меня?

Спасибо

Экспериментально кажется, что это работает с голым psycopg2. Курсор, предоставляемый Django, должен быть более или менее совместим с курсором psycopg2:

import psycopg2

create_sql = """
CREATE OR REPLACE FUNCTION multi_cur() RETURNS SETOF refcursor AS $$
DECLARE cursor1 refcursor;
DECLARE cursor2 refcursor;
BEGIN
    OPEN cursor1 FOR SELECT x * x FROM generate_series(1, 10) AS x;
    RETURN NEXT cursor1;
    
    OPEN cursor2 FOR SELECT SQRT(x) FROM generate_series(1, 10) AS x;
    RETURN NEXT cursor2;
END;
$$ LANGUAGE plpgsql;
"""

with psycopg2.connect(dbname='postgres') as conn:
    with conn.cursor() as curs:
        curs.execute(create_sql)
        curs.execute("SELECT * FROM multi_cur()")
        # Get the cursor names (['<unnamed portal 1>', '<unnamed portal 2>'])
        cursor_names = [r[0] for r in curs]
        # Fetch all results from those cursors
        for name in cursor_names:
            # Must use f-strings instead of interpolation since `name` is an identifier,
            # not a string.
            curs.execute(f"FETCH ALL FROM \"{name}\"")
            print([r[0] for r in curs])

Вывод

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.8284271247461903, 3.0, 3.1622776601683795]

вполне ожидаемо.

Вернуться на верх