登录
首页 >  Golang >  Go问答

PostgreSQL JSON 的参数化字符串插入

来源:stackoverflow

时间:2024-03-03 09:03:26 469浏览 收藏

大家好,今天本人给大家带来文章《PostgreSQL JSON 的参数化字符串插入》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

根据此链接,我应该使用原始 `` 字符串通过 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: got 1 个参数,但语句需要 0”

在使用 fmt.println(query, l.name) 进行故障排除时,原始字符串参数似乎不起作用,并且“name”字段的计算结果仍然为“$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
}

今天关于《PostgreSQL JSON 的参数化字符串插入》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>