【免费下载链接】squirrel️ Type safe SQL in Gleam项目地址https://gitcode.com/gh_mirrors/squirrel4/squirrel点击查看免费下载Squirrel 是 Gleam 生态中一款出色的类型安全 SQL代码生成工具你在*.sql文件里写查询它自动生成带正确类型与编解码器的函数。但在处理**可空查询参数nullable query parameters**时Squirrel 有一个官方承认的限制——Postgres 不会暴露参数的可空性元数据因此 Squirrel 无法为可空列自动推断出Option类型。别担心本文给出 3 种经过官方认可的实用变通技巧帮你快速绕开这个限制 为什么 Squirrel 无法自动推断可空参数先看一个典型场景。假设有这样一张表和一个更新查询create table if not exists recipe( id int primary key, title text not null, author uuid, -- 可能缺失 description text -- 可能缺失 ); -- update_recipe_author.sql update recipe set author $1 where id $2;Squirrel 生成的函数签名会是update_recipe_author(db, arg1: Uuid, arg2: Int)——注意arg1是Uuid而非Option(Uuid)。原因是 Squirrel 通过检查 Postgres 暴露的元数据来推断类型而参数侧$1、$2Postgres 不提供可空信息详见 README.md 的 FAQ 部分以及参数解析逻辑 src/squirrel/internal/database/postgres.gleam。⚠️ 注意区分返回列的可空性 Squirrel 是能自动推断的它会检查not null约束甚至解析查询执行计划来判断 LEFT JOIN 产生的空值唯独参数这一侧需要变通。技巧一拆分为两条查询各司其职当可空参数很少、逻辑简单时最推荐的做法是干脆定义两条查询一条写入真实值一条显式写入null-- set_recipe_author.sql设置作者 update recipe set author $1 where id $2;-- remove_recipe_author.sql清除作者 update recipe set author null where id $2;优点SQL 简单直白、函数语义清晰set_recipe_authorvsremove_recipe_author调用方一看就懂。这是官方 FAQ 给出的首选方案适合 90% 的简单场景 ✅技巧二哨兵值 CASE WHEN 转换 null当可空参数很多、或查询逻辑复杂不适合复制多份时可以挑选一个哨兵值sentinel value代表null在 SQL 内部做转换-- update_recipe.sql update recipe set author case $1 when 00000000-0000-0000-0000-000000000000 then null else $1 end, description case $2 when then null else $2 end where id $3;调用方传入全零 UUID或空字符串就表示清空该字段。查询保持单文件、单函数避免了查询爆炸。技巧三用 SQL 辅助函数封装 null 转换逻辑技巧二的查询写多了会变得臃肿。记住一句话SQL 也是代码同样值得重构️ 把哨兵转换抽成数据库函数create function string_or_null(value text) returns text language sql immutable return nullif(value, );查询立刻变得清爽-- update_recipe.sql update recipe set author uuid_or_null($1), description string_or_null($2) where id $3;优点转换规则只写一次、处处复用主查询回归简洁nullif这类函数本身就是 Postgres 的标准能力。3 种技巧选型速查表场景推荐技巧关键考量可空参数 ≤ 2 个、逻辑简单技巧一拆分两条查询语义最清晰零额外复杂度可空参数多、查询复杂技巧二哨兵值 CASE单文件单函数避免查询膨胀多个查询都要做 null 转换技巧三SQL 辅助函数规则复用查询保持整洁改完 SQL 后运行gleam run -m squirrel重新生成代码并在 CI 中用gleam run -m squirrel check校验代码是否过期参见 README.md 的 CLI Commands 一节。补充返回列可空性 Squirrel 能自动推断如果你的痛点其实是返回值该不该是OptionSquirrel 已经替你解决了它检查列的not null约束并解析explain查询计划识别 LEFT/FULL JOIN 引入的空值实现见 src/squirrel/internal/database/postgres.gleam 中resolve_returns的逻辑。推断不准时还可以用别名后缀强制指定列名以?结尾强制可空、以!结尾强制非空。更多背景可参考 CHANGELOG.md 中关于 optional 类型修复的记录。写在最后可空参数是 Squirrel 当前唯一需要你多想一步的地方但三种变通技巧都很轻量简单就拆查询复杂就用哨兵值重复就抽函数。结合check子命令你可以放心地把这套模式固化进团队规范继续享受 Squirrel 带来的类型安全 SQL 体验 ️赞分享【免费下载链接】squirrel️ Type safe SQL in Gleam项目地址https://gitcode.com/gh_mirrors/squirrel4/squirrel点击查看免费下载相关推荐60,000 项目都在用的 AGENTS.md3步让AI编码助手读懂你的项目60,000 项目都在用的 AGENTS.md3步让AI编码助手读懂你的项目 每次跟AI编码助手开新会话你都得重复交代一遍依赖用 pnpm、测试要跑过再文档AI Agent前端Fiddler中文版完整教程HTTP/HTTPS流量捕获与分析实战Fiddler中文版完整教程HTTP/HTTPS流量捕获与分析实战 Fiddler Web Debugger中文版是一款功能强大的Web调试工具能够帮助开发开发工具接口测试Django SQL Explorer 参数化查询终极实战指南10个实用技巧提升数据查询效率Django SQL Explorer 参数化查询终极实战指南10个实用技巧提升数据查询效率 Django SQL Explorer 是一个强大的数据探索工具后端数据分析开发工具大模型上一篇不到25元把普通眼镜变成AI智能眼镜OpenGlass 完整上手攻略下一篇res-downloader 视频下载与视频号解密指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考