postgresql - 如何将 pgx.Rows 从 Query() 转换为 json 数组?
问题描述
我正在使用github.com/jackc/pgx
postgreSQL 工作。Noq 我想将 pgx.Rows 从 Query() 转换为 json 数组。我尝试了 func for *sql.Rows
,但它不适用于*pgx.Rows
func PgSqlRowsToJson(rows *pgx.Rows) []byte {
fieldDescriptions := rows.FieldDescriptions()
var columns []string
for _, col := range fieldDescriptions {
columns = append(columns, col.Name)
}
count := len(columns)
tableData := make([]map[string]interface{}, 0)
values := make([]interface{}, count)
valuePtrs := make([]interface{}, count)
for rows.Next() {
for i := 0; i < count; i++ {
valuePtrs[i] = &values[i]
}
rows.Scan(valuePtrs...)
entry := make(map[string]interface{})
for i, col := range columns {
var v interface{}
val := values[i]
b, ok := val.([]byte)
if ok {
v = string(b)
} else {
v = val
}
entry[col] = v
}
tableData = append(tableData, entry)
}
jsonData, _ := json.Marshal(tableData)
return jsonData
}
问题是它Scan()
不适用interface{}
,它只适用于明确定义的类型。你能帮我解决一下吗?
解决方案
您可以使用pgx.FieldDescription
'Type
方法来检索列的预期类型。将其传递给reflect.New
您,然后可以分配一个指向该类型值的指针,然后使用这些新分配的值,您可以制作一个非 nil 切片,interface{}s
其基础值具有预期的类型。
例如:
func PgSqlRowsToJson(rows *pgx.Rows) []byte {
fieldDescriptions := rows.FieldDescriptions()
var columns []string
for _, col := range fieldDescriptions {
columns = append(columns, col.Name)
}
count := len(columns)
tableData := make([]map[string]interface{}, 0)
valuePtrs := make([]interface{}, count)
for rows.Next() {
for i := 0; i < count; i++ {
valuePtrs[i] = reflect.New(fieldDescriptions[i].Type()).Interface() // allocate pointer to type
}
rows.Scan(valuePtrs...)
entry := make(map[string]interface{})
for i, col := range columns {
var v interface{}
val := reflect.ValueOf(valuePtrs[i]).Elem().Interface() // dereference pointer
b, ok := val.([]byte)
if ok {
v = string(b)
} else {
v = val
}
entry[col] = v
}
tableData = append(tableData, entry)
}
jsonData, _ := json.Marshal(tableData)
return jsonData
}
推荐阅读
- angular - Angular 谷歌地图从 JSON 加载标记数据
- android - callback.onResult() 没有将值返回给 PageKeyedDataSource 中的适配器
() 在安卓中 - dart - Dart 中类构造函数语法的区别
- jquery - jQuery过滤器:找不到任何内容时无法显示消息
- jquery - 当关联元素包含字符串时,jQuery 仅隐藏下一个元素的最佳方法
- javascript - Typescript ReconnectingWebSocket 调用构造函数失败
- apache - Heroku PHP 应用程序在某些链接上出现 302 错误,而不是其他链接
- pyserial - 从十六进制 pyModBus 中删除尾随位
- cassandra - 如何在 Cassandra 中获得 X% 百分位数
- java - 如何使用 Lombok 实例化具有许多对象作为字段的类?