You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让PostgreSQL查询的OFFSET和LIMIT在SQLC生成Go代码时可选?

如何在sqlc中实现可选的OFFSET和LIMIT参数

你遇到的错误是因为sqlc.arg并不支持nullable => true这种语法,这个写法是早期讨论中的提议,并没有被sqlc采纳实现。下面给你两种可行的解决方案:

方案一:使用动态SQL模板(推荐)

利用sqlc的模板语法,根据参数是否存在来决定是否生成OFFSET和LIMIT子句,完全满足“可选”的需求——当不传入对应参数时,这两个子句不会出现在最终执行的SQL里:

-- name: ListTransfersTo :many
SELECT *
FROM transfers
WHERE to_account_id = $1
ORDER BY created_at
{{ if .offset }}OFFSET {{ .offset }}{{ end }}
{{ if .limit }}LIMIT {{ .limit }}{{ end }};

这样生成的代码会把offset和limit作为可选参数,调用时可以只传to_account_id,也可以按需传入其中一个或两个参数。

方案二:使用可空参数结合默认值

如果希望参数允许为null,同时给默认值(比如offset默认0,limit默认返回所有结果),可以用sqlc.narg(表示可空参数)配合COALESCE函数:

-- name: ListTransfersTo :many
SELECT *
FROM transfers
WHERE to_account_id = $1
ORDER BY created_at
OFFSET COALESCE(sqlc.narg('offset'), 0)
LIMIT COALESCE(sqlc.narg('limit'), (SELECT COUNT(*) FROM transfers WHERE to_account_id = $1));

不过这种方式需要额外处理limit的默认值(比如查询符合条件的总条数),相比模板语法会复杂一些,适合需要固定默认值的场景。

内容的提问来源于stack exchange,提问作者twentyfourk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:46:06