#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. спасибо, я проверю и обновлю!