JS+Flask项目如何实现数据库分页,解决Datatables服务端计数异常问题
分页实现侧的选择
首先明确:必须在Flask侧实现分页。
你当前已经开启了Datatable的serverSide: true服务端模式,这种设计本身就是要求后端承接分页逻辑:JS侧分页本质还是一次性拉取全量数据,大数据量下加载慢、浏览器卡顿的问题根本无法解决,只有后端分页每次只返回当前页的少量数据,才能真正解决可用性问题。
计数为0的异常原因
你看到的Showing 0 to 0 of 0 entries (filtered from NaN total entries)报错,是因为服务端模式下Datatable要求后端返回固定格式的响应,你当前的接口没有返回draw、recordsTotal、recordsFiltered这几个必填的统计字段,前端无法解析总数据量,才会出现计数异常。
具体改造方案
1. 后端Flask接口改造
以你当前的SQL查询场景为例,不需要SQLAlchemy,直接修改原生SQL和接口返回逻辑即可:
from flask import request, jsonify # 引入你自己用的数据库操作依赖,比如pymysql/psycopg2等,替换下方的execute_sql为你自己的查询方法 @app.route('/api/information', methods=['GET']) def get_information(): # 接收Datatable自动传递的分页参数 draw = int(request.args.get('draw', 1)) start = int(request.args.get('start', 0)) # 当前页起始索引,从0开始 page_size = int(request.args.get('length', 10)) # 每页显示条数 # 第一步:查询全量数据总条数,用于前端计数 count_sql = "SELECT COUNT(*) AS total FROM alvaro.alcatraz_kongo" total_count = execute_sql(count_sql)[0]['total'] # 替换为你自己的查询执行逻辑,拿到总条数 # 第二步:拼接分页查询SQL,增加LIMIT和OFFSET实现分页 data_sql = """ SELECT name AS Name, phone AS Phone, adress AS Adress FROM alvaro.alcatraz_kongo LIMIT %s OFFSET %s """ # 执行查询,参数顺序先传每页条数,再传起始索引 page_data = execute_sql(data_sql, (page_size, start)) # 替换为你自己的参数化查询逻辑 # 第三步:按照Datatable要求的格式返回响应 return jsonify({ "draw": draw, # 请求标识原封不动返回,避免前端请求错乱 "recordsTotal": total_count, # 全量数据总条数 "recordsFiltered": total_count, # 未做搜索过滤时和总条数一致即可 "data": page_data # 当前页的业务数据 })
2. 前端细节检查
- 确认你代码里的接口路径
/api/infrmation没有拼写错误,正确路径应该和后端接口保持一致(示例中是/api/information) - 确认SQL查询返回的字段别名和前端
columns配置的字段名完全匹配,大小写也要对应,否则会出现列渲染为空的问题
扩展说明
如果后续需要接入搜索、排序功能,只需要在SQL中增加对应的WHERE、ORDER BY逻辑,同时将recordsFiltered返回为过滤后的总条数即可;如果使用的是不支持LIMIT/OFFSET语法的数据库(比如Oracle),替换为对应数据库的分页语法即可。
内容的提问来源于stack exchange,提问作者jaxon0x0x
相关产品推荐
相关产品推荐

