Go语言 在查询中使用LEFT联接扫描SQLC生成的代码中的NULL列时出错

evrscar2  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(107)

我刚刚修改了PostgreSQL中的一个表,使其为NULL,如下所示:

  1. CREATE TABLE a {
  2. a_name varchar NOT NULL
  3. b_id BIGINT <-- was previously NOT NULL with no problems
  4. }
  5. CREATE TABLE b {
  6. id BIGSERIAL,
  7. b_name varchar NOT NULL
  8. }

在a.B_id > b. id上有一个外键约束。
我有一些查询JOIN这些表并返回类似于以下内容的b.name:

  1. -- name: List :many
  2. SELECT
  3. a_name,
  4. b_name
  5. FROM a
  6. LEFT JOIN b ON b.id = a.bid <-- produces NULL columns in results

由于LEFT JOINb_name查询的返回类型可以是NULLa.b_id中的任何NULL行将返回NULL作为B_name。明显值
实际上,查询要复杂得多,在WHERE子句中发送多个可空参数,但直觉上我不觉得这是问题所在。SQLC肯定是从查询的SELECT部分配置它的行结构体...?
SQLC正在生成类似于以下内容的行结构:

  1. type ListRow struct {
  2. AName string `json:"a_name"'
  3. BName string `json:"b_name"'
  4. }

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

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

我显然在文档中遗漏了一些明显的东西,因为这必须是一个常规操作。到目前为止,我在使用SQLC进行INNER JOIN表的相当复杂的查询或具有可空的列返回类型时没有遇到任何问题。
不知道SO社区对SQLC有多活跃,感谢任何直观或模糊的反馈。

7tofc5zh

7tofc5zh1#

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

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

或者,如果可以接受并且有意义,则将其替换为coalesce(b_name, '')

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

或筛选b_name为空的结果

  1. SELECT a_name, b_name
  2. FROM a LEFT JOIN b ON b.id = a.bid
  3. where b_name is not null;
展开查看全部

相关问题