各位开发人员大家好
我在尝试使用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")
不能,我不能使用邮递员从数据库中删除文章。
谢谢一束。
最佳答案
多亏@mkopriva的评论,我才知道
1。
请勿对SQL使用Query
或QueryRow
,这一点非常重要
不返回任何行的查询,在这种情况下,请使用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/