我刚刚修改了PostgreSQL中的一个表,使其为NULL,如下所示:
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上有一个外键约束。
我有一些查询JOIN这些表并返回类似于以下内容的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
查询的返回类型可以是NULL
。a.b_id
中的任何NULL
行将返回NULL
作为B_name。明显值
实际上,查询要复杂得多,在WHERE子句中发送多个可空参数,但直觉上我不觉得这是问题所在。SQLC肯定是从查询的SELECT部分配置它的行结构体...?
SQLC正在生成类似于以下内容的行结构:
type ListRow struct {
AName string `json:"a_name"'
BName string `json:"b_name"'
}
BName应该是可空的(我在配置中使用了各种gobuffalo空值覆盖),但它不在结构中,因此会导致扫描错误:
"sql: Scan error on column index 1, name \"b_name\": converting NULL to string is unsupported"
我显然在文档中遗漏了一些明显的东西,因为这必须是一个常规操作。到目前为止,我在使用SQLC进行INNER JOIN表的相当复杂的查询或具有可空的列返回类型时没有遇到任何问题。
不知道SO社区对SQLC有多活跃,感谢任何直观或模糊的反馈。
1条答案
按热度按时间7tofc5zh1#
建议-在查询中将
b_name
替换为coalesce(b_name, '** Attention **')
,以查看可能发生的情况。或者,如果可以接受并且有意义,则将其替换为
coalesce(b_name, '')
。或筛选
b_name
为空的结果