为什么我的defer stmnt.Close()
似乎阻止了我的http.Redirect
重定向,只是挂在无限尝试加载的网站上。
但如果我删除defer stmnt.Close()
它重定向就好了吗?
err = db.QueryRow("SELECT steamid FROM accounts WHERE steamid = ?", ids).Scan(&steamid)
if err != nil {
common.WriteLog(err.Error(), r)
http.Error(w, "Failed to connect to database. Try again in a bit.", 500)
}
switch {
case len(profile.Response.Players) == 0:
common.WriteLog("Failed to look you up in the steam database. Try again in a bit.", r)
http.Error(w, "Failed to look you up in the steam database. Try again in a bit.", 500)
case err == sql.ErrNoRows:
stmnt, err := db.Query("INSERT INTO accounts SET steamid=?", ids)
if err != nil {
common.WriteLog(err.Error(), r)
http.Error(w, "Failed to insert your account to the database. Try again in a bit.", 500)
}
defer stmnt.Close() // <<<<< The suspect
// Insert Account
http.Redirect(w, r, "/", 303)
case err != nil:
common.WriteLog(err.Error(), r)
http.Error(w, "Failed to insert your account to the database. Try again in a bit.", 500)
default:
// Login User
http.Redirect(w, r, "/", 303)
}
答案 0 :(得分:3)
使用db.Exec
代替db.Query
。
Exec执行查询而不返回任何行。
VS
Query执行返回行的查询
至于为什么,我猜想mysql Rows.Close
正在等待数据on the connection:
func (rows *mysqlRows) Close() error {
mc := rows.mc
if mc == nil {
return nil
}
if mc.netConn == nil {
return ErrInvalidConn
}
// Remove unread packets from stream
err := mc.readUntilEOF()
rows.mc = nil
return err
}
这永远不会发生。
例如,请参阅this。