我正在开发一个简单的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
驱动程序?
1条答案
按热度按时间k7fdbhmy1#
您可以编辑
sqlc
配置文件,为要使用Go类型而不是pgtype
类型的字段指定自定义类型,并通过在sqlc.yaml
文件中指定所需的Go类型来覆盖这些类型字符串
请注意,直接使用Go类型可能会在与数据库交互时导致潜在的类型不匹配或其他问题,而
pgtype
类型是专门为处理PostgreSQL特定的数据类型而设计的,并提供一定程度的类型安全性和兼容性!更新
根据您的评论,当将
pgx/v5
驱动程序与sqlc
一起使用时,生成的代码使用pgtype
类型来处理PostgreSQL特定的数据类型,并且这是使用pgx/v5
驱动程序时sqlc
的默认行为,以及您描述的使用pgtype
类型的方式,例如pgtype.Text
和pgtype.Int4
,是处理这些类型的正确方法,例如,当处理pgtype.Text
类型时,您需要将String
字段设置为所需的值,并将Valid
字段设置为true
。关于数值类型,
pgtype.Numeric
类型需要设置Int
、Exp
和Status
字段,这是因为pgtype.Numeric
类型将数值表示为任意精度整数(Int
)、指数(Exp
)和指示该值是存在还是空的状态(Status
)!