如何将pgx.Query()返回的pgx.Rows转换为JSON数组?
解决pgx.Rows转JSON数组的问题
我明白你现在遇到的问题——标准库*sql.Rows的转换函数没法直接用在pgx.Rows上,因为两者的API细节有差异。我来帮你完善这个转换函数,确保它能正确处理pgx的查询结果并转成JSON数组。
完整的转换函数实现
import ( "encoding/json" "github.com/jackc/pgx/v5" ) func PgSqlRowsToJson(rows pgx.Rows) ([]byte, error) { // 确保rows被正确关闭,避免资源泄漏 defer rows.Close() // 获取字段描述,提取列名 fieldDescriptions := rows.FieldDescriptions() columns := make([]string, len(fieldDescriptions)) for i, col := range fieldDescriptions { columns[i] = col.Name } count := len(columns) tableData := make([]map[string]interface{}, 0) values := make([]interface{}, count) valuePtrs := make([]interface{}, count) // 为每个值创建指针,用于pgx的扫描操作 for i := range values { valuePtrs[i] = &values[i] } // 遍历每一行数据 for rows.Next() { // 扫描当前行到valuePtrs指向的变量中 err := rows.Scan(valuePtrs...) if err != nil { return nil, err } // 将当前行的键值对存入map rowMap := make(map[string]interface{}) for i, col := range columns { rowMap[col] = values[i] } tableData = append(tableData, rowMap) } // 检查遍历过程中是否出现错误 if err := rows.Err(); err != nil { return nil, err } // 将数据序列化为JSON jsonData, err := json.Marshal(tableData) if err != nil { return nil, err } return jsonData, nil }
关键细节说明
- 资源释放:用
defer rows.Close()确保不管函数执行结果如何,都能释放数据库连接资源,这是pgx操作中很重要的一点。 - 扫描指针的处理:pgx的
Scan方法需要传入指针切片,所以我们先创建values切片存储值,再把每个元素的地址存入valuePtrs,这样扫描后就能直接从values中获取当前行的数据。 - 错误处理:全程不忽略任何错误——包括扫描错误、遍历行时的错误,以及JSON序列化的错误,这样能快速定位问题。
- 兼容性:这个函数完全基于pgx的API实现,和标准库的
*sql.Rows逻辑区分开,能正确处理pgx返回的各种数据类型。
你可以直接调用这个函数,传入查询得到的pgx.Rows,就能得到对应的JSON数组字节流啦。
内容的提问来源于stack exchange,提问作者Sviatoslav
相关产品推荐
相关产品推荐

