如何让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
相关产品推荐
相关产品推荐

