问题内容
我刚刚将 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
的返回类型可以是 NULL
。 a.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)其它相关文章!