Heim > Backend-Entwicklung > Golang > Fehler beim Scannen von NULL-Spalten im von SQLC generierten Code mit LEFT-Join in der Abfrage

Fehler beim Scannen von NULL-Spalten im von SQLC generierten Code mit LEFT-Join in der Abfrage

WBOY
Freigeben: 2024-02-06 08:30:04
nach vorne
466 Leute haben es durchsucht

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

Frageninhalt

Ich habe gerade eine Tabelle in PostgreSQL wie folgt auf NULLABLE geändert:

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
}
Nach dem Login kopieren

a.b_id > b.id hat Fremdschlüsseleinschränkungen.

Ich habe eine Reihe von Abfragen, die diese Tabellen verknüpfen und b.name zurückgeben, ähnlich wie dieser:

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

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

Tatsächlich ist die Abfrage viel komplexer und sendet mehrere nullfähige Parameter in der WHERE-Klausel, aber intuitiv glaube ich nicht, dass das das Problem ist. Sicherlich konfiguriert SQLC seine Zeilenstruktur aus dem SELECT-Teil der Abfrage ...?

SQLC generiert eine Zeilenstruktur ähnlich dieser:

type ListRow struct {
   AName string `json:"a_name"'
   BName string `json:"b_name"'
}
Nach dem Login kopieren

BName sollte nullfähig sein (ich verwende verschiedene Gobuffalo-Null-Überschreibungen in der Konfiguration), ist aber nicht in der Struktur enthalten und verursacht daher einen Scanfehler:

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

Mir fehlt offensichtlich etwas Offensichtliches in der Dokumentation, da es sich um einen regulären Vorgang handeln muss. Bisher hatte ich keine Probleme bei der Verwendung von SQLC mit ziemlich komplexen INNER JOIN-Tabellenabfragen oder mit nullbaren Spaltenrückgabetypen.

Ich bin mir nicht sicher, wie aktiv die SO-Community in Bezug auf SQLC ist. Wir freuen uns über jedes Feedback, ob intuitiv oder vage.


Richtige Antwort


Vorschlag – Platzieren Sie b_name 替换为 coalesce(b_name, '** Attention **') in der Abfrage, um zu sehen, was passieren könnte.

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

oder ersetzen Sie es alternativ durch coalesce(b_name, ''), wenn das akzeptabel und sinnvoll ist.

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

oder filtern b_name auf Nullergebnisse

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

Das obige ist der detaillierte Inhalt vonFehler beim Scannen von NULL-Spalten im von SQLC generierten Code mit LEFT-Join in der Abfrage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage