Rust diesel Postgres как добавить разбивку на страницы в запрос

#rust #rust-diesel

Вопрос:

Я использую 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,)>(amp;self.pool.get()?)?;
 

Ответ №1:

Я изучил документ Diesel и обнаружил limit , что функции (doc) и offset (doc) выглядят многообещающими для реализации разбивки на страницы. Пожалуйста, попробуйте добавить эти две функции перед load функцией, как показано ниже. Инициализируйте page_size с 20 и смещением с 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,)>(amp;self.pool.get()?)?;
    if employee_account.len() <= 0 { break;}
    offset  = page_size;
}
 

Комментарии:

1. спасибо за воспроизведение, оно работает, когда Id primary key является номером приращения, когда Id is UUID оно не работает.

2. Пожалуйста, попробуйте и посмотрите, устранена ли проблема с ключом UUID, отсортировав результаты с помощью функции order до limit и offset. Извините, у меня нет среды для проверки.

3. спасибо, я проверю и обновлю!