使用查询中的 LEFT 连接扫描 SQLC 生成的代码中的 NULL 列时出错

2024年 2月 6日 107.3k 0

使用查询中的 left 连接扫描 sqlc 生成的代码中的 null 列时出错

问题内容

我刚刚将 PostgreSQL 中的一个表修改为 NULLABLE,如下所示:

CREATE TABLE a {
a_name varchar NOT NULL
b_id BIGINT 登录后复制

a.b_id > b.id 有外键约束。

我有许多查询连接这些表并返回与此类似的 b.name:

-- name: List :many
SELECT
a_name,
b_name
FROM a
LEFT JOIN b ON b.id = a.bid 登录后复制

由于 LEFT JOIN,查询 b_name 的返回类型可以是 NULLa.b_id 中任何为 NULL 的行都将为 b_name 返回 NULL。观察。

实际上,查询要复杂得多,在 WHERE 子句中发送多个可为空的参数,但直观上我并不觉得这是问题所在。当然 SQLC 从查询的 SELECT 部分配置其行结构...?

SQLC 正在生成与此类似的行结构:

type ListRow struct {
AName string `json:"a_name"'
BName string `json:"b_name"'
}

登录后复制

BName 应该可以为空(我在配置中使用各种 gobuffalo null 覆盖),但不在结构中,因此会导致扫描错误:

"sql: Scan error on column index 1, name "b_name": converting NULL to string is unsupported"

登录后复制

我显然遗漏了文档中明显的内容,因为这必须是常规操作。迄今为止,我在使用 SQLC 进行相当复杂的 INNER JOIN 表查询或具有可为 null 的列返回类型时没有遇到任何问题。

不确定 SO 社区对 SQLC 有多活跃,感谢任何直观或模糊的反馈。

正确答案

建议 - 将查询中的 b_name 替换为 coalesce(b_name, '** Attention **') 以查看可能发生的情况。

SELECT
a_name,
coalesce(b_name, '** Attention **')
FROM a LEFT JOIN b ON b.id = a.bid;

登录后复制

或者或者用 coalesce(b_name, '') 替换它(如果这是可以接受并且有意义的)。

SELECT
a_name,
coalesce(b_name, '')
FROM a LEFT JOIN b ON b.id = a.bid;

登录后复制

或者过滤 b_name 为 null 的结果

SELECT a_name, b_name
FROM a LEFT JOIN b ON b.id = a.bid
where b_name is not null;

登录后复制

以上就是使用查询中的 LEFT 连接扫描 SQLC 生成的代码中的 NULL 列时出错的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论