登录
首页 >  Golang >  Go问答

在扫描 SQLC 生成的代码时,使用 LEFT 连接查询时遇到 NULL 列导致出错

来源:stackoverflow

时间:2024-02-08 22:12:24 492浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《在扫描 SQLC 生成的代码时,使用 LEFT 连接查询时遇到 NULL 列导致出错》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

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

CREATE TABLE a {
    a_name varchar NOT NULL
    b_id BIGINT <-- was previously NOT NULL with no problems 
}

CREATE TABLE b {
    id BIGSERIAL,
    b_name varchar NOT NULL
}

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 <-- produces NULL columns in results

由于 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;

到这里,我们也就讲完了《在扫描 SQLC 生成的代码时,使用 LEFT 连接查询时遇到 NULL 列导致出错》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>