Rumah >pembangunan bahagian belakang >Golang >Ralat semasa mengimbas lajur NULL dalam kod yang dijana SQLC menggunakan LEFT join dalam pertanyaan

Ralat semasa mengimbas lajur NULL dalam kod yang dijana SQLC menggunakan LEFT join dalam pertanyaan

WBOY
WBOYke hadapan
2024-02-06 08:30:04459semak imbas

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

Kandungan soalan

Saya baru sahaja mengubah suai jadual dalam PostgreSQL kepada NULLABLE seperti berikut:

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 mempunyai kekangan kunci asing.

Saya mempunyai beberapa pertanyaan yang menyertai jadual ini dan mengembalikan b.nama serupa dengan ini:

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

Disebabkan LEFT JOIN,查询 b_name 的返回类型可以是 NULLa.b_id 中任何为 NULL 的行都将为 b_name 返回 NULL. memerhati.

Sebenarnya, pertanyaannya jauh lebih kompleks, menghantar berbilang parameter nullable dalam klausa WHERE, tetapi secara intuitif saya tidak fikir itu masalahnya. Pasti SQLC mengkonfigurasi struktur barisnya daripada bahagian SELECT pertanyaan...?

SQLC menjana struktur baris yang serupa dengan ini:

type ListRow struct {
   AName string `json:"a_name"'
   BName string `json:"b_name"'
}

BName sepatutnya boleh dibatalkan (saya menggunakan pelbagai penggantian nol gobuffalo dalam konfigurasi), tetapi tiada dalam struct, sekali gus menyebabkan ralat imbasan:

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

Saya jelas kehilangan sesuatu yang jelas daripada dokumentasi, kerana ini mestilah operasi biasa. Setakat ini saya tidak mempunyai sebarang masalah menggunakan SQLC dengan pertanyaan jadual INNER JOIN yang agak kompleks atau dengan jenis pemulangan lajur yang boleh dibatalkan.

Tidak pasti betapa aktifnya komuniti SO tentang SQLC, menghargai sebarang maklum balas, intuitif atau kabur.


Jawapan Betul


Cadangan - Letakkan b_name 替换为 coalesce(b_name, '** Attention **') dalam pertanyaan untuk melihat perkara yang mungkin berlaku.

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

atau menggantikannya dengan coalesce(b_name, '') jika itu boleh diterima dan masuk akal.

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

atau tapis b_name kepada keputusan batal

SELECT a_name, b_name
FROM a LEFT JOIN b ON b.id = a.bid
where b_name is not null;

Atas ialah kandungan terperinci Ralat semasa mengimbas lajur NULL dalam kod yang dijana SQLC menggunakan LEFT join dalam pertanyaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam