各位开发人员大家好
我在尝试使用GO构建简单的Web 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")

不能,我不能使用邮递员从数据库中删除文章。
谢谢一束。

sqlite - 带有SQLITE3的GO API无法从数据库中删除元组-LMLPHP
sqlite - 带有SQLITE3的GO API无法从数据库中删除元组-LMLPHP

最佳答案

多亏@mkopriva的评论,我才知道

1。

请勿对SQL使用QueryQueryRow,这一点非常重要
不返回任何行的查询,在这种情况下,请使用Exec 方法。使用Query时,您始终必须将结果分配给
非空白标识符,即_以外的任何标识符,然后调用Close
一旦完成结果,就可以使用该方法。如果你不这样做
那么您的应用程序将泄漏数据库连接,很快
开始崩溃。

2。

当您要将用户输入(包括记录ID)传递给您的
您必须始终使用参数引用的查询
您正在使用的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

关于sqlite - 带有SQLITE3的GO API无法从数据库中删除元组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60885331/

10-09 06:19
查看更多