如何在不获取整个表的情况下分页?

2024-04-27 03:04:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试对从我的获取的数据进行分页(来自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)

这里的问题是:我首先获取整个表,然后对其分页。如何在不必获取整个表的情况下对分页? 注意:我没有使用Django模型


Tags: theinimportjsonfordbsqldef
1条回答
网友
1楼 · 发布于 2024-04-27 03:04:00

我建议从数据库调用过滤后的数据,因为它是分页的,您可以使用skip和limit逻辑调用API来解析下一个或preciding数据。在

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

例如 在开始时,您需要前10行,然后从应用程序传递param 跳过次数=0和限制=10

^{pr2}$

现在,如果单击next并想要下10行,只需传递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)

相关问题 更多 >