我剛剛將 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
的回傳類型可以是 NULL
。 a.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中文網其他相關文章!