Как разбить на страницы, не выбирая всю таблицу? - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь разбить на страницы извлеченные данные из моей таблицы (из Удаленная база данных на Azure ), как можно увидеть вкод ниже:

    import json
    import pyodbc

    # Includes other imports

    def query_db(query):
        """
        Function that queries the required table in the DB
        """

        cnxn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server}; \
                               SERVER=db.database.windows.net; \
                               DATABASE=DB; UID=id; PWD=pwd')
        cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
        cur = cnxn.cursor()
        cur.execute(query)

        # Fetches the entire table ## This is causing the lagg
        r = [dict( (cur.description[i][0], value) for i, value in enumerate(row) ) for row in cur.fetchall()]

        cur.connection.close()

        return(r)

    @api_view(['GET'])
    def get(request):
        paginator = PageNumberPagination()
        my_query = query_db("select * from Client_Table")

        result_page = paginator.paginate_queryset(my_query, request)
        json_output = json.dumps(result_page, cls=DjangoJSONEncoder)

        return paginator.get_paginated_response(json_output)

Проблема здесь в том, что я сначала извлекаю всю таблицу, а затем разбиваю ее на страницы.Как мне Paginate , без необходимости извлекать всю таблицу? ПРИМЕЧАНИЕ: я не использую Django Models

1 Ответ

1 голос
/ 15 апреля 2019

Я бы предложил вызывать отфильтрованные данные из БД, так как они разбиты на страницы, вы можете вызывать API с помощью логики пропуска и ограничения для анализа следующих или уточняющих данных.

SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

Например, при запускехотите сначала 10 ROWS, затем из вашего приложения передайте параметр skip = 0 & limit = 10

SELECT * FROM TableName ORDER BY id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

Теперь, если вы нажмете next и захотите следующие 10 ROWS, вам просто нужно передать параметры skip = 10 & limit = 10

SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

Точно так же вы можете изменить результат для каждой страницы, передав лимит как угодно.

Согласно вашему коду, я ожидаю, что вы используете метод GET

@api_view(['GET'])
def get(request):
    paginator = PageNumberPagination()
    skip=request.params.get('skip')
    limit=request.params.get('limit')
    query = "SELECT * FROM Client_table ORDER BY ID OFFSET "+ skip + " ROWS FETCH NEXT " + limit+" ROWS ONLY"
    my_query = query_db(query)
    result_page = paginator.paginate_queryset(my_query, request)
    json_output = json.dumps(result_page, cls=DjangoJSONEncoder)

    return paginator.get_paginated_response(json_output)
...