Golang中如何处理Postgres的JSON列
Golang中如何处理Postgres的JSON列 我正在从PostgreSQL数据库中检索数据,其中有一个JSON类型的列,请问在Golang中如何处理JSON列?
2 回复
更多关于Golang中如何处理Postgres的JSON列的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中处理PostgreSQL的JSON列,主要可以通过database/sql包配合pq驱动或pgx驱动来实现。以下是两种常见的方法:
方法1:使用database/sql和pq驱动(扫描到[]byte或string)
package main
import (
"database/sql"
"encoding/json"
"fmt"
"log"
_ "github.com/lib/pq"
)
type User struct {
ID int
Data map[string]interface{}
}
func main() {
connStr := "user=postgres dbname=test sslmode=disable"
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Fatal(err)
}
defer db.Close()
var user User
var jsonData []byte
// 查询数据
err = db.QueryRow("SELECT id, data FROM users WHERE id = $1", 1).Scan(&user.ID, &jsonData)
if err != nil {
log.Fatal(err)
}
// 解析JSON数据
err = json.Unmarshal(jsonData, &user.Data)
if err != nil {
log.Fatal(err)
}
fmt.Printf("User: %+v\n", user)
}
方法2:使用pgx驱动的原生JSON支持(推荐)
package main
import (
"context"
"fmt"
"log"
"github.com/jackc/pgx/v4"
)
type User struct {
ID int
Data map[string]interface{}
}
func main() {
connStr := "postgres://postgres:password@localhost:5432/test"
conn, err := pgx.Connect(context.Background(), connStr)
if err != nil {
log.Fatal(err)
}
defer conn.Close(context.Background())
var user User
// pgx可以直接扫描到map[string]interface{}
err = conn.QueryRow(context.Background(),
"SELECT id, data FROM users WHERE id = $1", 1).Scan(&user.ID, &user.Data)
if err != nil {
log.Fatal(err)
}
fmt.Printf("User: %+v\n", user)
}
插入JSON数据的示例:
// 使用database/sql
data := map[string]interface{}{
"name": "John",
"age": 30,
"email": "john@example.com",
}
jsonData, _ := json.Marshal(data)
_, err = db.Exec("INSERT INTO users (data) VALUES ($1)", jsonData)
// 使用pgx
_, err = conn.Exec(context.Background(),
"INSERT INTO users (data) VALUES ($1)", data)
pgx驱动在处理JSON列时更加方便,因为它支持直接映射到Go的数据类型,无需手动进行JSON序列化/反序列化。

