Golang中如何处理Postgres的JSON列

Golang中如何处理Postgres的JSON列 我正在从PostgreSQL数据库中检索数据,其中有一个JSON类型的列,请问在Golang中如何处理JSON列?

2 回复

或许这能帮到你:

github.com/lib/pq

问题:如何使用 jsonb

如何在模型中声明一个 jsonb 类型的列? 如何使用它?

或者查看 pg 的相关问题

更多关于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序列化/反序列化。

回到顶部