用于Postgres JSON插入的原始参数化字符串

时间:2019-03-27 07:30:15

标签: sql json postgresql go

根据this link,我应该使用原始的''字符串来使用Golang对SQL数据库执行查询,以避免SQL注入。对于我的用例,我试图对我的一个数据对象使用Postgres的json类型。

我的结构如下〜

type LessonDB struct {  // for DB data retrieval
    ID     int    `db:"id"`
    Lesson string `db:"lesson"`
}

type Lesson struct {  // for general data operations
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Pages []Page `json:"pages,omitempty"`
}

我的查询执行如下〜

func (l *Lesson) Insert() error {
    query := `
        INSERT INTO lessons (lesson)
        VALUES ('{
            "name": "$1"
        }')
        RETURNING id;
    `
    err := db.QueryRow(query, l.Name).Scan(&l.ID)
    return err
}

PostMan返回一个错误,提示〜“ pq:有1个参数,但该语句需要0”

在使用fmt.PrintLn(query,l.Name)进行故障排除时,原始字符串参数似乎不起作用,并且“名称”字段仍评估为“ $ 1”

1 个答案:

答案 0 :(得分:1)

问题在于$1位于带引号的字符串中,因此它仅被视为文字SQL值的一部分。您实际上是在插入{"name": "$1"}

您不能以这种方式插入值的一部分。相反,您必须在Go中构造值并插入整个值。

func (l *Lesson) Insert() error {
    query := `
        INSERT INTO lessons (lesson)
        VALUES ($1)
        RETURNING id;
    `
    // Demonstration only, don't produce JSON like this.
    value := fmt.Sprintf("{\"name\": \"%s\"}", l.Name)
    err := db.QueryRow(query, value).Scan(&l.ID)
    return err
}