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.Text
和 pgtype.Int4
,是处理这些类型的正确方法,例如,在处理 pgtype.Text
类型时,您需要将 String
字段设置为所需的值,并将 Valid
字段设置为 true
。
对于数字类型,pgtype.Numeric
类型需要设置Int
、Exp
和Status
字段,这是因为pgtype.Numeric
类型表示一个任意精度整数的数值(Int
) ), 指数(Exp
),以及一个状态(Status
),指示该值是否存在或为空!
以上就是Go - 使用 pgtypes 的正确方法的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341