我正在尝试使用jackc/pgx在PostgreSQL中插入/更新数据到一个包含复合类型列的表中。这是一个golan结构体编写的表类型:
// Added this struct as a Types in PSQL
type DayPriceModel struct {
Date time.Time `json:"date"`
High float32 `json:"high"`
Low float32 `json:"low"`
Open float32 `json:"open"`
Close float32 `json:"close"`
}
//表中的2列
type SecuritiesPriceHistoryModel struct {
Symbol string `json:"symbol"`
History []DayPriceModel `json:"history"`
}
列history
是一个复合类型的数组,我在PSQL中将其定义为DayPriceModel。我想使用jack/pgx
在golang中向history
追加一个新元素
到目前为止,我已经编写了给定的代码:
// The code for newType was generated by ChatGPT so it might or might not be correct. Feel free to overwrite this part.
newType, _ := pgtype.NewCompositeType("day_price_model", []pgtype.CompositeTypeField{
{Name: "date", OID: pgtype.DateOID},
{Name: "high", OID: pgtype.Float4OID},
{Name: "low", OID: pgtype.Float4OID},
{Name: "open", OID: pgtype.Float4OID},
{Name: "close", OID: pgtype.Float4OID},
}, (*pgtype.ConnInfo)(pool.Config().ConnConfig.TLSConfig.ClientCAs))
_, err = pool.Exec(context.Background(), `UPDATE equity.securities_price_history
SET history = $1::equity.day_price[] || history WHERE symbol = $2`,
composite_value_here, "something") // unable to form the composite_value_here variable
使用jack/pgx,如何从复合类型创建新的复合值以写入PSQL查询。
1条答案
按热度按时间iibxawm41#
要求
psql
定义github.com/jackc/pgx/v5
最简单的方法是使用
pgx.LoadType()/pgx.RegisterType()
和已经在db中定义的复合类型。因为我们有一个复合类型的数组,所以我们需要对复合类型本身和数组类型都做这件事(你可以分别用
select 'day_price_model'::regtype::oid;
和select 'day_price_model[]'::regtype::oid;
来检查oid是不同的)。对于配准,我们可以从v5/pgtype documentation中获取
RegisterDataTypes
。假设类型是使用
psql
创建的,如下所示:RegisterDataTypes
可能类似于:注意上面两种类型的数据类型名称。
给予一些模拟数据:
insert
将简单地表示为:和
update
是这样的:测试
为了有一个完整的、自包含的测试示例,我们需要一个数据库和一个小的测试程序,考虑到上面提到的几点。
数据库
使用
psql
的测试数据库可以像这样创建:围棋项目
测试程序的输出为:
正如您所看到的,已经插入了一条记录,更新已经成功执行,因为数组中有三个元素,并且可以从DB中读取数据。
如果你想再次尝试,你显然应该再次从表中删除数据,例如用
psql
,但是,这个例子应该尽可能小,以便用本地数据库运行一个例子。