Go -使用pgtypes的正确方法

du7egjpx  于 2023-11-14  发布在  Go
关注(0)|答案(1)|浏览(84)

我正在开发一个简单的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驱动程序?

k7fdbhmy

k7fdbhmy1#

您可以编辑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特定的数据类型,并且这是使用pgx/v5驱动程序时sqlc的默认行为,以及您描述的使用pgtype类型的方式,例如pgtype.Textpgtype.Int4,是处理这些类型的正确方法,例如,当处理pgtype.Text类型时,您需要将String字段设置为所需的值,并将Valid字段设置为true
关于数值类型,pgtype.Numeric类型需要设置IntExpStatus字段,这是因为pgtype.Numeric类型将数值表示为任意精度整数(Int)、指数(Exp)和指示该值是存在还是空的状态(Status)!

相关问题