GO API с SQLITE3 не может УДАЛИТЬ кортеж из БД - PullRequest
0 голосов
/ 27 марта 2020

Здравствуйте, коллеги-разработчики. Я пытаюсь выучить GO при создании простого веб-API с использованием sqlite3. Я застрял в какой-то момент, когда я не могу удалить строки из своей таблицы, отправив запрос DELETE от почтальона. Я пытаюсь использовать код ниже, чтобы удалить строку. Я уже подтвердил, что у меня есть доступ к БД, и я также могу удалить строки с помощью командного инструмента sqlite3. Я не понимаю, что не так!

func deleteArticle(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    params := mux.Vars(r) // get any params
    db := connectToDB(dbName)
    defer db.Close()

    _, err := db.Query("DELETE FROM article WHERE id=" + params["id"])
    if err != nil {
        fmt.Fprintf(w, "article couldn't be found in db")
    }
}

Вот часть навигации:

myRouter.HandleFunc("/articles/{id}", deleteArticle).Methods("DELETE")

Не важно, что я делаю, я не могу удалить статью из БД с помощью почтальона . Благодарения.

postman delete_method

1 Ответ

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

Благодаря комментариям @ mkopriva я узнал, что

1.

Очень важно, чтобы вы не использовали Query и QueryRow для SQL запросов, которые не возвращают никаких строк, для этих случаев используйте метод Exec. Когда вы используете Query, вам всегда нужно присваивать результат непустому идентификатору, то есть любому, кроме _, а затем вызывать метод Close для этого, как только вы закончите с результатом. Если вы этого не сделаете, ваше приложение будет пропускать соединения БД и очень скоро начнет падать.

2.

, если вы хотите передать пользовательский ввод (включая запись идентификаторы) для ваших запросов вы должны всегда использовать синтаксис ссылки на параметр, поддерживаемый используемым вами диалектом и / или директивой sql, а затем передавать ввод отдельно. Это означает, что вы никогда не должны делать

Exec("DELETE FROM article WHERE id=" + params["id"]),

, вместо этого вы всегда должны делать

Exec("DELETE FROM article WHERE id= ?",params["id"])

Если вы не сделаете это, и вместо этого продолжайте использовать простую конкатенацию строк, ваше приложение будет уязвимо для SQL атак внедрения.

Относительно этой информации я изменил свой код на:

func deleteArticle(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    params := mux.Vars(r) // get any params
    db := connectToDB(dbName)
    defer db.Close()
    fmt.Printf("%q\n", params["id"])
    statement, err := db.Prepare("DELETE FROM article WHERE id= ?")
    if err != nil {
        fmt.Fprintf(w, "article couldn't be found in db")
    }
    statement.Exec(params["id"])
}

, который решил мою проблему. Так что спасибо @ mkopriva

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...