首页  >  文章  >  后端开发  >  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 类型而不是 sqlc 使用 Go 类型而不是 pgtypes,同时仍然使用 pgx/v5 驱动程序?

解决方法

您可以编辑 sqlc 配置文件,为要使用 Go 类型而不是 pgtype 类型的字段指定自定义类型,并通过在 sqlc.yaml,同时仍然使用 pgx/v5 驱动程序?

解决方法pgtype您可以编辑 sqlc 配置文件,为要使用 Go 类型而不是

类型的字段指定自定义类型,并通过在 sqlc.yaml 文件中指定所需的 Go 类型来覆盖类型

types:
  - name: ListAccountsParams
    fields:
      - name: Owner
        goType: string
      - name: Limit
        goType: int32
      - name: Offset
        goType: int32
请注意,直接使用 Go 类型在与数据库交互时可能会导致潜在的类型不匹配或其他问题,而

类型是专门为处理 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

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

以上是Go - 使用 pgtypes 的正确方法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除