Heim  >  Artikel  >  Backend-Entwicklung  >  Go – Richtige Art, pgtypes zu verwenden

Go – Richtige Art, pgtypes zu verwenden

PHPz
PHPznach vorne
2024-02-13 22:18:101186Durchsuche

Go - 使用 pgtypes 的正确方法

PHP-Editor Xigua stellt Ihnen heute eine korrekte Methode zur Verwendung von pgtypes vor, die für Entwickler, die die Go-Sprache für die PostgreSQL-Datenbankprogrammierung verwenden, sehr wichtig ist. pgtypes ist eine Go-Sprachbibliothek, die Konvertierungs- und Verarbeitungsfunktionen für und von PostgreSQL-Datenbanktypen bereitstellt. Durch die ordnungsgemäße Verwendung von pgtypes können Fehler und Ausnahmen beim Umgang mit Datenbanktypen vermieden und gleichzeitig die Lesbarkeit und Wartbarkeit Ihres Codes verbessert werden. In diesem Artikel erläutern wir die korrekte Verwendung von pgtypes sowie einige allgemeine Überlegungen und Best Practices. Wenn Sie ein Entwickler sind, der die Go-Sprache für die PostgreSQL-Datenbankprogrammierung verwendet, dann lesen Sie bitte weiter. Ich glaube, dass dieser Artikel für Sie hilfreich sein wird.

Frageninhalt

Ich entwickle einen einfachen Go 服务来连接到数据库进行基本查询。我正在使用 sqlc 生成 Go 函数来与数据库交互。当将驱动程序从 lib/pq 切换到 pgx/v5 时,现在数据库字段的类型是 pgtypes 而不是 Go Typ. Hier ein Beispiel:

Stattdessen:

type ListAccountsParams struct {
        Owner  string `json:"owner"`
        Limit  int32  `json:"limit"`
        Offset int32  `json:"offset"`
    }

Ich verstehe jetzt:

type ListAccountsParams struct {
        Owner  pgtype.Text `json:"owner"`
        Limit  pgtype.Int4 `json:"limit"`
        Offset pgtype.Int4 `json:"offset"`
    }

Aber die einzige Möglichkeit, die ich gefunden habe, um pgtypes zu verwenden, ist diese:

owner := pgtype.Text{
        String: "Craigs List",
        Valid: true,
    }

statt nur auszuführen owner := "Craigs List". Für numerische Typen ist es noch übertriebener, alle Implementierungen, die ich gefunden habe, sahen so aus:

pgtype.Numeric{
    Int: big.NewInt(-543), 
    Exp: 3, 
    Status: pgtype.Present
    }

Es hat keinen Sinn, sqlc 配置文件,我可以覆盖这些类型以支持 Go 标准类型,但是对我来说必须将 postgres text 类型覆盖为 string usw. zu verwenden...

Meiner Meinung nach ist dies nicht die beste Art, diese Typen zu verwenden, es ist für mich kontraintuitiv. Meine Frage ist also: Mache ich es richtig? Gibt es einen anderen Ansatz? Gibt es letztendlich eine Möglichkeit, sqlc so zu konfigurieren, dass Go-Typen anstelle von sqlc 使用 Go 类型而不是 pgtypes,同时仍然使用 pgx/v5 驱动程序?

解决方法

您可以编辑 sqlc 配置文件,为要使用 Go 类型而不是 pgtype 类型的字段指定自定义类型,并通过在 sqlc.yaml verwendet werden, während weiterhin der pgx/v5-Treiber verwendet wird?

ProblemumgehungpgtypeSie können die sqlc-Konfigurationsdatei bearbeiten, um benutzerdefinierte Typen für die Felder anzugeben, für die Sie Go-Typen anstelle von

-Typen verwenden möchten, und sie in der sqlc.yaml Datei Überschreiben Sie den Typ, indem Sie den erforderlichen Go-Typ in <strong> angeben <pre class="brush:php;toolbar:false;">types: - name: ListAccountsParams fields: - name: Owner goType: string - name: Limit goType: int32 - name: Offset goType: int32</pre> </strong>Bitte beachten Sie, dass die direkte Verwendung von Go-Typen zu potenziellen Typkonflikten oder anderen Problemen bei der Interaktion mit der Datenbank führen kann, während

-Typen speziell für die Verarbeitung von PostgreSQL-spezifischen Datentypen entwickelt wurden und ein gewisses Maß an Typsicherheit und -kompatibilität bieten!

pgx/v5 驱动程序与 sqlc 一起使用时,生成的代码使用 pgtype 类型来处理 PostgreSQL 特定的数据类型,这是 sqlc 在使用 pgx/v5 驱动程序时的默认行为,以及方式您描述的使用 pgtype 类型,例如 pgtype.Textpgtype.Int4,是处理这些类型的正确方法,例如,在处理 pgtype.Text 类型时,您需要将 String 字段设置为所需的值,并将 Valid 字段设置为 true

Aktualisiert

pgtype.Numeric类型需要设置IntExpStatus字段,这是因为pgtype.Numeric类型表示一个任意精度整数的数值(Int) ), 指数(Exp),以及一个状态(Status

Ihrem Kommentar zufolge verwendet der generierte Code bei Verwendung des pgx/v5-Treibers mit sqlc 🎜 Typen, um PostgreSQL-spezifische Datentypen zu verarbeiten, die sqlc bei Verwendung des pgx/v5-Treibers und die Art und Weise, wie Sie die Verwendung von 🎜-Typen wie pgtype.Text und pgtype.Int4 beschreiben ist die richtige Art, mit diesen Typen umzugehen. Wenn Sie beispielsweise den Typ pgtype.Text verarbeiten, müssen Sie das Feld String auf den erforderlichen Wert setzen und festlegen das Feld Valid auf true. 🎜 🎜Für numerische Typen 🎜) und gibt an, ob der Wert vorhanden oder leer ist! 🎜

Das obige ist der detaillierte Inhalt vonGo – Richtige Art, pgtypes zu verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen