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

Rust Diesel连接Postgres数据库如何为查询添加分页功能

实现方案

你用Diesel对接PostgreSQL实现分页+获取总记录数的需求可以通过两次查询实现,一次统计符合条件的总条数,一次拉取当前页的分页数据,1.4.x版本直接用内置的limit、offset、count方法即可实现,不需要额外依赖。

完整代码示例

// 定义分页参数,可根据业务需求动态传入
const PAGE_SIZE: i64 = 20;
let current_page: i64 = 1; // 页码默认从1开始,可根据实际逻辑调整
let offset = (current_page - 1) * PAGE_SIZE;
let conn = &self.pool.get()?;

// 1. 查询符合条件的总记录数
let total_records: i64 = employee::table
    .inner_join(account::table.on(employee::dsl::employee_id.eq(account::dsl::employee_id)))
    .filter(account::dsl::employee_id.eq(employeeId))
    .count()
    .get_result(conn)?;

// 2. 查询当前页的分页数据
let employee_account = employee::table
    .inner_join(account::table.on(employee::dsl::employee_id.eq(account::dsl::employee_id)))
    .filter(account::dsl::employee_id.eq(employeeId))
    .limit(PAGE_SIZE)
    .offset(offset)
    .load::<(Employee_Details,)>(conn)?;

注意事项

  • 统计总条数和拉取分页数据的过滤、关联条件必须完全一致,避免出现总条数和实际分页数据匹配不上的问题。
  • 如果数据量超过十万级,offset过大时会出现查询性能下降,可改用游标分页优化:每次拉取数据时记录当前页最大的主键ID,下一次查询时新增filter(主键 > 上次记录的最大ID)条件,去掉offset参数即可大幅提升查询效率。
  • 两次查询可放在同一个数据库事务中执行,避免两次查询间隙数据发生变动导致的统计结果和分页数据不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:54:03