Django + PostgreSQL Connection - Невозможно использовать серверный курсор - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть хранимая процедура в PostgreSQL, которая возвращает refcursor (его имя может быть передано в качестве аргумента):

-- Example stored procedure....
CREATE OR REPLACE FUNCTION example_stored_procedure(ref refcursor, gid_number integer) RETURNS refcursor AS $$
DECLARE
ref refcursor;
BEGIN
 OPEN $1 for SELECT * FROM lucca_routes where gid = gid_number;
 RETURN $1;
END;
$$ LANGUAGE plpgsql;

Затем я могу получить набор результатов из консоли postgres без проблем в этомway:

BEGIN;
select example_stored_procedure('customcursor', 1);
FETCH ALL IN "customcursor";
COMMIT;

Но мне нужно получить набор результатов из приложения Django (используя его соединение с postgreSQL).Согласно this , я пытался:

from django.db import connections
from rest_framework.response import Response
from rest_framework.decorators import api_view

@api_view(['GET'])
def testing_procedure(request):
    connection = connections['default']
    with connection.cursor() as cursor:
        cursor.execute("BEGIN")
        cursor.callproc("example_stored_procedure", ['customcursor', 1])
        # "steal" the cursor - ERROR HERE!
        cursor2 = connection.cursor('customcursor')
        # fetch here the data from cursor2...
        return Response(result)

Когда я пытаюсь "украсть" новый курсор (создание cursor2), возвращенный callproc (), у меня появляется ошибка:

TypeError: курсор () принимает 1 позиционный аргумент, но 2 были даны

Что я делаю неправильно?Как я могу получить данные из refcursor, возвращенного callproc ()?

Я использую psycopg2 2.7.5

1 Ответ

0 голосов
/ 27 сентября 2018

Я публикую решение для будущих читателей на основе комментария @Alasdair.

Вы можете использовать функцию create_cursor (self, name = None) из объекта DatabaseWrapper для использования курсора на стороне сервера.

В моем примере:

def testing_procedure(request):
    connection = connections['default']
    with connection.cursor() as cursor:
        cursor.execute("BEGIN")
        cursor.callproc("example_stored_procedure", ['customcursor', 1])
        cursor2 = connection.create_cursor('customcursor')
        # fetch here the data from cursor2...
        result = cursor2.fetchall() # works!
        return Response(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...