拓冰建站拓冰建站
首页 / 资讯中心 / 正文

如何快速上手 Scrivener.Ecto:5 分钟为 Ecto 查询加上分页(新手教程)

如何快速上手 Scrivener.Ecto5 分钟为 Ecto 查询加上分页新手教程【免费下载链接】scrivener_ectoPaginate your Ecto queries with Scrivener项目地址: https://gitcode.com/gh_mirrors/sc/scrivener_ectoScrivener.Ecto是 Elixir 生态中专为Ecto 查询分页打造的轻量库只需一行代码就能让 Phoenix 列表页自动获得当前页码、每页条数、总页数、总记录数等完整分页信息。本文是一份面向新手的上手指南5 分钟带你完成从安装到实际使用的全过程。一、认识 Scrivener.Ecto它解决什么问题在没有分页之前all(query)会把表里所有记录一次性查出来数据量一大页面就卡住了。Scrivener.Ecto 的思路非常简单在Ecto.Repo里加一行use ScrivenerRepo 就自动拥有paginate/2函数把任意 Ecto 查询交给paginate它替你执行count offset/limit两条查询返回一个现成的分页结构体Scrivener.Page与 Phoenix 天然契合直接把控制器收到的params传进去即可。⚠️ 注意它仅支持允许子查询的数据库后端如 PostgreSQL。这是新手最容易踩的第一个坑。二、最快安装方法3 步集成到你的项目第 1 步添加依赖在项目的mix.exs的deps中加入defp deps do [ {:scrivener_ecto, ~ 2.0} ] end第 2 步拉取依赖mix deps.get第 3 步让 Repo 支持分页打开你应用里的 Repo 模块加入一行use Scrivener并可顺便设置默认每页条数不设置则默认10条defmodule MyApp.Repo do use Ecto.Repo, otp_app: :my_app, adapter: Ecto.Adapters.Postgres use Scrivener, page_size: 10 end本仓库的测试 Repo 就给出了这样的示范见test/support/repo.ex它同时设置了max_page_size: 10后文会解释其作用。✅三、5 分钟上手给 Ecto 查询加分页最简用法一个 Schema 模块直接分页page MyApp.Person | MyApp.Repo.paginate()连查询条件都没有也能直接分页非常适合新手先跑通流程。实战用法带条件、排序与预加载的查询假设你在 Phoenix 控制器里要展示年龄大于 30 的人列表def index(conn, params) do page MyApp.Person | where([p], p.age 30) | order_by(desc: :age) | preload(:friends) | MyApp.Repo.paginate(params) render conn, :index, people: page.entries, page_number: page.page_number, total_pages: page.total_pages, total_entries: page.total_entries end 注意最后一行paginate(params)直接吃 Phoenix 的params。只要前端传了page2page_size5它就会自动按第 2 页、每页 5 条来查。当然也可以显式传页码MyApp.Person | where([p], p.age 30) | order_by(desc: :age) | MyApp.Repo.paginate(page: 2, page_size: 5)三种传参方式灵活应对传参方式示例适用场景不传paginate()使用 Repo 里配置的默认值params 映射paginate(%{page 2, page_size 3})Phoenix 控制器直接透传关键字选项paginate(page: 2, page_size: 3)后端逻辑内部调用四、看懂分页结果Page 结构体五大字段paginate返回的Scrivener.Page结构体有 5 个字段模板里取用即可字段含义示例值page_number当前是第几页1page_size每页条数10entries本页的数据列表[...]total_entries总记录数37total_pages总页数4渲染分页条时total_pages决定按钮数量total_entries适合展示共 37 条。五、进阶技巧4 个实用参数帮你避坑以下细节都体现在核心实现lib/scrivener/paginater/ecto/query.ex中理解它们能让你少踩不少坑1.max_page_size限制单页最大条数在use Scrivener, page_size: 5, max_page_size: 10中配置后即使前端请求page_size20实际也只会返回 10 条防止恶意大查询拖垮数据库。2. 越界页码的默认保护请求第 3 页但总共只有 2 页时Scrivener.Ecto默认把页码钳制到最后一页第 2 页而不是返回空页。若你希望越界时明确返回空列表可传options: [allow_overflow_page_number: true]。3.offset与total_entries选项options: [offset: 2]可自定义跳过条数默认是page_size * (page_number - 1)options: [total_entries: 130]可跳过 count 查询直接给定总数。列表页已经知道总数时能省一次数据库往返适合做性能优化。⚡4.prefix多租户场景options: [prefix: tenant_1]支持按 schema 前缀查询多租户应用里非常实用测试用例见test/scrivener/paginator/ecto/query_test.exs末尾。六、新手常见问题排查清单❓为什么查不到 / 报错确认你的后端支持子查询PostgreSQL 没问题MySQL 系适配器可能受限。❓0 条记录时 total_pages 是多少是1而不是0方便模板统一渲染。❓默认每页多少条Repo 未配置时为 10 条。❓支持distinct/group_by吗支持count 逻辑已对DISTINCT、GROUP BY、preload做了专门处理。❓想在 Task 等异步进程里调用传caller: parent_pid可正常执行跨进程查询。 项目目前处于低维护模式仅响应 PR 和破坏性问题版本更新节奏较慢生产使用前建议锁定版本号。版本历史可参考 CHANGELOG.md 的说明。小结Scrivener.Ecto 用一行use 一行paginate的成本换来了 Ecto 查询的标准分页能力mix.exs加依赖mix deps.get安装Repo 里use Scrivener, page_size: 10查询管道最后接Repo.paginate(params)模板里读取Page的 5 个字段即可。掌握max_page_size、越界钳制、total_entries优化这几个进阶参数后你的 Phoenix 列表页就既有体验又安全了。【免费下载链接】scrivener_ectoPaginate your Ecto queries with Scrivener项目地址: https://gitcode.com/gh_mirrors/sc/scrivener_ecto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门