Drizzle ORM 分页查询与总数统计:如何避免过滤逻辑重复?
优化Drizzle分页查询的重复过滤逻辑
你当前的代码需要为数据查询和总数统计重复编写过滤逻辑,确实有更简洁的实现方式——先构建统一的带过滤条件的基础查询,再基于它分别扩展分页查询和总数统计查询,这样过滤逻辑只需要写一次,还能保证两个查询的过滤规则完全一致。
优化后的代码实现
const drizzle = await db(); // 第一步:构建统一的基础过滤查询(仅包含过滤条件,暂不添加分页、排序) let baseQuery = drizzle.select().from(verTable); // 统一给基础查询添加所有过滤条件 if (title) { baseQuery = baseQuery.where(ilike(verTable.title, `%${title}%`)); } if (industryDesc) { baseQuery = baseQuery.where( or( ilike(verTable.industry, `%${industryDesc}%`), ilike(verTable.desc, `%${industryDesc}%`) ) ); } if (state) { baseQuery = baseQuery.where(ilike(verTable.state, `%${state}%`)); } if (company) { baseQuery = baseQuery.where(ilike(verTable.company_name, `%${company}%`)); } // 第二步:基于基础查询扩展出分页数据查询和总数统计查询 const rowsQuery = baseQuery.orderBy(verTable.id).limit(limit).offset(offset); const totalQuery = drizzle.select({ value: count() }).from(baseQuery.as('filtered_data')); // 并行执行两个查询提升效率 const [rows, total] = await Promise.all([rowsQuery, totalQuery]);
优化点说明
- 消除重复代码:过滤逻辑只编写一次,分页和统计查询复用同一个基础过滤规则,避免后续修改过滤条件时需要两处同步修改。
- 提升执行效率:使用
Promise.all并行执行两个查询,比串行执行节省时间。 - 逻辑一致性:确保数据查询和总数统计的过滤条件完全一致,不会出现数据列表和总数不匹配的问题。
内容的提问来源于stack exchange,提问作者povici
相关产品推荐
相关产品推荐

