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
相关产品推荐
相关产品推荐

