postgresql - sqlx 将 postgres 数组扫描到结构中

标签 postgresql go sqlx

我正在尝试在 go 中创建一个基本的评论 API。我似乎无法弄清楚如何将 postgresql 数组扫描到结构中的结构数组中。我想我可以将 Thread.Posts 类型设置为 jsonb,但这似乎不够优雅,因为我认为我必须解码它。

sql: Scan error on column index 3, name "posts": unsupported Scan, storing driver.Value type []uint8 into type *[]models.Post

var threadSchema = `
CREATE TABLE IF NOT EXISTS thread (
  id         SERIAL PRIMARY KEY,
  name       VARCHAR(100) NOT NULL,
  profile_id INTEGER REFERENCES profile (id)
)`

var postSchema = `
CREATE TABLE IF NOT EXISTS post (
  id         SERIAL PRIMARY KEY,
  comment    TEXT,
  profile_id INTEGER REFERENCES profile (id),
  thread_id  INTEGER REFERENCES thread (id)
)`

type Post struct {
    Id        int    `db:"id" json:"id"`
    Comment   string `db:"comment" json:"comment" binding:"required" form:"comment"`
    ProfileId int   `db:"profile_id" json:"profile_id" binding:"required" form:"profile_id"`
    ThreadId  int    `db:"thread_id" json:"thread_id" binding:"required" form:"thread_id"`
}

type Thread struct {
    Id        int    `db:"id" json:"id"`
    Name      string `db:"name" json:"name" binding:"required" form:"name"`
    ProfileId int    `db:"profile_id" json:"profile_id" binding:"required" form:"profile_id"`
    Posts     []Post `db:"posts" json:"posts" form:"posts"`
}

func GetThreads(db *sqlx.DB, c *gin.Context) {
    threads := []Thread{}
    err := db.Select(&threads, `
    SELECT thread.id,thread.name,thread.profile_id,array_agg(post.id) AS posts
    FROM thread
    INNER JOIN post ON thread.id = post.thread_id
    GROUP BY thread.id;
  `)
    if err != nil {
        log.Fatal(err)
    }
    c.JSON(http.StatusOK, gin.H{"data": threads})
}

最佳答案

你可以定义你的类型:

type Posts []Post

// Scan implements the sql.Scanner interface.
func (a *Posts) Scan(src interface{}) error {
  // ...
}

// Value implements the driver.Valuer interface.
func (a Posts) Value() (driver.Value, error) {
  // ...
}

有关实现的更多信息,请参见例如 here

关于postgresql - sqlx 将 postgres 数组扫描到结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54034983/

相关文章:

django - 告诉 Django 使用哪个数据库模板

postgresql - 在 Postgresql 数据库中存储递归结构

sql - 如何使用嵌套查询避免 PostgreSQL 中的 DRY

sql - Postgresql 查询获取一年内每月的计数

docker - 如何请求由Go运行在Cloud Run上的gRPC服务器

postgresql - 如何从 Golang 中的字符串解析日期以插入到 Postgres 中?

pointers - 检查基础类型是否是具有反射的结构

sql - 在 sqlx 或数据库/sql(golang)中立即开始?

mysql - 如何记录所有来自 Go/MySQL 的传出 SQL 语句?

sql - 在触发之前不更新值postgresql