首頁  >  文章  >  後端開發  >  Go - 使用 pgtypes 的正確方法

Go - 使用 pgtypes 的正確方法

PHPz
PHPz轉載
2024-02-13 22:18:101246瀏覽

Go - 使用 pgtypes 的正确方法

php小編西瓜今天為大家介紹一種正確的使用 pgtypes 的方法,這對於使用 Go 語言進行 PostgreSQL 資料庫程式設計的開發者來說非常重要。 pgtypes 是一個 Go 語言的函式庫,它提供了與 PostgreSQL 資料庫類型之間的轉換和處理功能。正確使用 pgtypes 可以避免在處理資料庫類型時出現錯誤和異常,同時也可以提高程式碼的可讀性和可維護性。在本文中,我們將詳細介紹如何正確使用 pgtypes,以及一些常見的注意事項和最佳實踐。如果你是使用 Go 語言進行 PostgreSQL 資料庫程式設計的開發者,那麼請繼續閱讀下去,相信這篇文章對你會有所幫助。

問題內容

我正在開發一個簡單的 Go 服務來連接到資料庫進行基本查詢。我正在使用 sqlc 產生 Go 函數來與資料庫互動。當驅動程式從lib/pq 切換到pgx/v5 時,現在資料庫欄位的類型是pgtypes 而不是Go 類型。這是一個例子:

而不是這個:

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

我現在明白了:

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

但我發現使用 pgtypes 的唯一方法是這個:

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

而非只執行 owner := "Craigs List"。對於數字類型就更矯枉過正了,我找到的所有實作都是這樣的:

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

使用sqlc 配置文件,我可以覆蓋這些類型以支援Go 標準類型,但是對我來說必須將postgres text 類型覆蓋為string 等等是沒有意義的...

在我看來,這不是使用這些類型的最佳方式,這對我來說是違反直覺的。所以我的問題是,我做得對嗎?有不同的方法嗎?最終,有沒有辦法配置 sqlc 使用 Go 類型而不是 pgtypes,同時仍然使用 pgx/v5 驅動程式?

解決方法

您可以編輯sqlc 設定文件,為要使用Go 類型而不是pgtype 類型的欄位指定自訂類型,並透過在sqlc.yaml 檔案中指定所需的Go 類型來覆寫類型

types:
  - name: ListAccountsParams
    fields:
      - name: Owner
        goType: string
      - name: Limit
        goType: int32
      - name: Offset
        goType: int32

請注意,直接使用Go 類型在與資料庫互動時可能會導致潛在的類型不匹配或其他問題,而pgtype 類型是專門為處理PostgreSQL 特定的資料類型而設計的,並提供一定程度的類型安全性和相容性!

更新

根據您的評論,當將pgx/v5 驅動程式與sqlc 一起使用時,產生的程式碼使用pgtype 類型來處理PostgreSQL 特定的資料類型,這是sqlc 在使用pgx/v5 驅動程式時的預設行為,以及方式您描述的使用pgtype 類型,例如pgtype .Textpgtype.Int4,是處理這些類型的正確方法,例如,在處理pgtype.Text 類型時,您需要將String#欄位設定為所需的值,並將Valid 欄位設為true

對於數字類型,pgtype.Numeric類型需要設定IntExpStatus字段,這是因為 pgtype.Numeric類型表示一個任意精確度整數的數值(Int) ), 指數(Exp),以及一個狀態(Status),指示該值是否存在或為空!

以上是Go - 使用 pgtypes 的正確方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除