You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用SQLAlchemy的情况下实现Flask数据分页?

原生数据库查询实现分页方案

核心思路

直接利用数据库原生的LIMIT和OFFSET语法实现数据分片,同时查询总记录数计算分页参数,最后在模板中渲染分页导航。


后端代码改造

修改你的data函数,加入分页逻辑:

from flask import request, render_template

def data():
    # 获取当前页码,默认显示第1页
    current_page = request.args.get('page', 1, type=int)
    # 每页固定显示10条数据(可根据需求调整)
    per_page = 10
    # 计算数据偏移量(跳过前面多少条数据)
    offset = (current_page - 1) * per_page

    # 1. 查询当前页的目标数据(用参数化查询避免SQL注入)
    cursor.execute("SELECT * FROM table_data LIMIT %s OFFSET %s", (per_page, offset))
    records = cursor.fetchall()

    # 2. 查询总记录数,用于计算总页数
    cursor.execute("SELECT COUNT(*) FROM table_data")
    total_records = cursor.fetchone()[0]
    # 向上取整计算总页数
    total_pages = (total_records + per_page - 1) // per_page

    # 处理页码边界,避免无效页码
    if current_page < 1:
        current_page = 1
    elif current_page > total_pages:
        current_page = total_pages

    # 将分页数据传给模板
    return render_template(
        'data.html',
        records=records,
        current_page=current_page,
        total_pages=total_pages,
        per_page=per_page
    )

注意:不同数据库的LIMIT/OFFSET语法可能略有差异,比如SQLite用?作为占位符,PostgreSQL支持LIMIT %s OFFSET %s或LIMIT %s, %s,根据你使用的数据库调整占位符格式。


前端模板分页导航

在data.html中添加分页控件,实现页码切换:

<div class="pagination-bar">
    <!-- 上一页按钮 -->
    {% if current_page > 1 %}
        <a href="{{ url_for('data', page=current_page-1) }}">上一页</a>
    {% else %}
        <span class="disabled">上一页</span>
    {% endif %}

    <!-- 页码列表 -->
    {% for page_num in range(1, total_pages + 1) %}
        {% if page_num == current_page %}
            <span class="current-page">{{ page_num }}</span>
        {% else %}
            <a href="{{ url_for('data', page=page_num) }}">{{ page_num }}</a>
        {% endif %}
    {% endfor %}

    <!-- 下一页按钮 -->
    {% if current_page < total_pages %}
        <a href="{{ url_for('data', page=current_page+1) }}">下一页</a>
    {% else %}
        <span class="disabled">下一页</span>
    {% endif %}
</div>

额外优化建议

  • 允许用户自定义每页条数:可以通过request.args.get('per_page', 10, type=int)接收前端传入的条数参数
  • 大数据量优化:COUNT(*)在超大表中可能较慢,可考虑用数据库的近似计数(如MySQL的EXPLAIN估算)或缓存总记录数
  • 样式美化:给分页控件添加CSS样式,提升用户体验

内容的提问来源于stack exchange,提问作者Jim Macaulay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:55:46