首页 > 解决方案 > SQLite 的分页

问题描述

嘿朋友我正在开发一个类似于现在服务的应用程序。我有来自用户的请求并且必须处理它。我为此使用 python-flask 和 sqlite。

我是烧瓶的新手,这是我的第一个项目。如果我错了,请纠正我。

result = cur.execute("SELECT * from orders")
orders = result.fetchmany(5)

我正在尝试使用orders = result.paginate(...)

不过好像有点问题。另外,我不确定如何在不同页面中显示数据库数据。

我想要第一页上的前 10 条记录,第二页上的下 10 条记录,依此类推..

请你帮助我好吗?

标签: pythonsqliteflask

解决方案


我从未使用过烧瓶,但假设您可以发出分页/页面抛出,那么引入值 0-9 的查询将允许有条件的页面抛出。

例如,假设一个订单表有 3 列orderdateordertypeorderdesc并且所需的顺序是根据这些列(见注释)的列,那么下面将引入一个从 0 到 9 的列,因此允许检查是否有投掷:-

SELECT *,
    (
        SELECT count() 
        FROM ORDERS 
        WHERE orderdate||ordertype||orderdesc < o.orderdate||o.ordertype||o.orderdesc 
        ORDER BY orderdate||ordertype||orderdesc
    ) % 10 AS orderby

FROM ORDERS AS o ORDER BY orderdate||ordertype||orderdesc
  • 请注意,以上依赖于排序顺序和具有相同结果的 where 子句,可能需要更复杂的 WHERE 子句。以上旨在作为原则上的示例。

示例用法

考虑以下使用中的上述示例。这会生成 100 行订单,其中随机生成的订单日期和订单类型在特定范围内,然后根据上述查询提取数据。underyling 数据和提取数据的结果显示在结果部分。

/* Create Test Environment */
DROP TABLE IF EXISTS orders;
/* Generate and load some random orders */
CREATE TABLE If NOT EXISTS orders (orderdate TEXT, ordertype TEXT, orderdesc TEXT);
WITH RECURSIVE cte1(od,ot,counter) AS 
    (
        SELECT 
            datetime('now','+'||(abs(random()) % 10)||' days'),
            (abs(random()) % 26),
            1
        UNION ALL SELECT 
            datetime('now','+'||(abs(random()) % 10)||' days'),
            (abs(random()) % 26),
            counter+1  
        FROM cte1 LIMIT 100
    )
INSERT INTO orders SELECT * FROM cte1;

/* Display the resultant data */
SELECT rowid,* FROM orders;

/* Display data with generated page throw indicator */
SELECT rowid,*,
    (
        SELECT count() 
        FROM ORDERS 
        WHERE orderdate||ordertype||orderdesc < o.orderdate||o.ordertype||o.orderdesc 
        ORDER BY orderdate||ordertype||orderdesc
    ) % 10 AS orderby
FROM ORDERS AS o ORDER BY orderdate||ordertype||orderdesc;
/* Clean up */
DROP TABLE IF EXISTS orders;

结果(部分)

核心数据(未按 rowid 排序(包含 rowid 用于比较目的)):-

在此处输入图像描述

带有页面抛出指示符的提取数据(突出显示)

在此处输入图像描述

  • 显然,您可能不会为第一行添加页面。
  • 由于为方便起见使用了 3 列的串联,因此结果可能有点混乱,例如 2 似乎大于 11,依此类推。
  • rowid 表示原来的位置,所以说明数据已经排好序了。

推荐阅读