Необработанные параметризованные строки для вставки postgres json - PullRequest
1 голос
/ 27 марта 2019

Согласно эта ссылка Я должен использовать необработанные строки `` для выполнения запросов к базе данных SQL с Golang, чтобы избежать SQL-инъекций. В моем случае я пытаюсь использовать json-тип Postgres для одного из моих объектов данных.

Мои структуры следующие ~

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) кажется, что параметр необработанных строк не работает, а поле «name» по-прежнему имеет значение «$ 1»

1 Ответ

1 голос
/ 27 марта 2019

Проблема в том, что $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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...