将字符串数组插入postgres文本数组字段

时间:2015-04-20 10:33:53

标签: postgresql go

我试图制作一篇可标记的文章。

文章表:

type Article struct {
  ID int64
  Body string
  Tags string
}

准备价值观:

tags := r.FormValue("tags")
tagArray := fmt.Sprintf("%q", strings.Split(tags, ", ")) // How do I make use of this?

t := Article{
    Body: "this is a post",
    Tags: `{"apple", "orange"}`,    // I have to hard code this for this to work.
}
if err := t.Insert(Db); err != nil {
   // Error handling
}

数据库查询:

func (t *Article) Insert(db *sqlx.DB) error {
    nstmt, err := db.PrepareNamed(`INSERT INTO articles
    (body, tags)
    VALUES (:body, :tags)
    RETURNING *;
    `)
    if err != nil {
        return err
    }
    defer nstmt.Close()

    err = nstmt.QueryRow(t).StructScan(t)
    if err, ok := err.(*pq.Error); ok {
        return err
    }
    return err
}

标签的Postgres设置字段:

tags character varying(255)[] DEFAULT '{}',

似乎我必须对标签的值进行硬编码以使其工作。否则我会得到这样的错误:

pq: missing dimension value
OR
pq: array value must start with "{" or dimension information

如何使用tagArray

有用的参考:https://gist.github.com/adharris/4163702

1 个答案:

答案 0 :(得分:0)

您需要使用正确的数组输入格式格式化标记,与硬编码值相同。

如果代码不包含任何需要转义的特殊字符,那么以下代码将有效:strconv.Quote将如何转义它们:

tags := "apple, orange"
tagArray := strings.Split(tags, ", ")
for i, s := range tagArray {
    tagArray[i] = strconv.Quote(s)
}
final := "{" + strings.Join(tagArray, ",") + "}"