【问题标题】:Rust diesel Postgres how to add pagination to queryRust 柴油 Postgres 如何在查询中添加分页
【发布时间】:2022-01-03 09:09:59
【问题描述】:

我正在使用diesel 连接并从 Postgres 数据库中获取数据。我想使用分页一次将大量记录从我的数据库中提取到几条记录中。假设我有 1000 条数据记录,我需要一次获取 20 条数据,总记录数。下面是我的表,我使用了内连接来获取数据。

#Emplyee table

| employee-id  | employee_name | empolyee_email|       
| -----------  | --------------|-------------  |
| 1            | ABC           |abc@mail.com   |
| 2            | xyz           |xyz@mail.com   |


# Account table

| account  | employee-id    | account-balnce | created_at|
| -------- | ----------     |--------------- |-----------|
| 1        | 1              |   2000         | 22/10/2021|
| 2        | 2              |   5000         | 01/09/2021|

我用来获取数据的查询。

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))
            .load::<(Employee_Details,)>(&self.pool.get()?)?;

【问题讨论】:

    标签: rust rust-diesel


    【解决方案1】:

    我浏览了 Diesel 文档,发现 limit (doc) 和 offset (doc) 函数看起来很有希望实现分页。请尝试在load 函数之前添加这两个函数,如下所示。用 20 初始化 page_size,用 0 初始化偏移量。循环直到没有数据返回。将偏移量增加页面大小以加载下一页。

    let page_size = 20;
    let mut offset = 0;
    
    loop {
        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,)>(&self.pool.get()?)?;
        if employee_account.len() <= 0 { break;}
        offset += page_size;
    }
    

    【讨论】:

    • 感谢重播,当Id primary key 是递增数字时它可以工作,当Id is UUID 它不起作用时。
    • 请尝试通过在限制和偏移之前使用 order 函数对结果进行排序,看看 UUID 键的问题是否消失。抱歉,我没有要验证的环境。
    • 谢谢,我会检查并更新!
    猜你喜欢
    • 2021-03-10
    • 2021-03-17
    • 2021-11-07
    • 2021-05-10
    • 2021-07-25
    • 2021-09-26
    • 2021-11-08
    • 2020-10-23
    • 2022-12-10
    相关资源
    最近更新 更多