首页 > 后端开发 > Golang > 正文

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

WBOY
发布: 2024-02-06 08:30:04
转载
448 人浏览过

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

问题内容

我刚刚将 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;
登录后复制

以上是使用查询中的 LEFT 连接扫描 SQLC 生成的代码中的 NULL 列时出错的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板