根据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”
答案 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
}