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
Lepaskan: 2024-02-06 08:30:04
ke hadapan
469 orang telah melayarinya

使用查询中的 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
}
Salin selepas log masuk

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
Salin selepas log masuk

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"'
}
Salin selepas log masuk

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"
Salin selepas log masuk

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;
Salin selepas log masuk

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;
Salin selepas log masuk

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;
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan