Golang中SQL表条目存在性检查始终返回false问题排查
排查rowExists函数始终返回false的问题
1. 字段/表名大小写不匹配
如果你的数据库(如PostgreSQL)对标识符大小写敏感,代码中使用的字段名和数据库实际字段名不一致会导致查询无结果:
- 检查
job_application表的字段名是JobID/UserID还是小写的job_id/user_id - 若数据库中是小写字段,将查询语句改为
SELECT 1 FROM job_application WHERE job_id = ? AND user_id = ?
2. 参数类型不匹配
- 检查JobID在数据库中的类型:如果是INT类型,从URL获取的
jobID是字符串形式,部分数据库不会自动做类型转换,导致条件不匹配。需要先将jobID转为整数:
之后用jobIDInt, err := strconv.Atoi(jobID) if err != nil { SendResponse(w, models.Response{Message: "Invalid job_id", Status: "Error"}) return }jobIDInt作为参数传入查询。
3. rowExists函数的错误处理优化
虽然SELECT EXISTS(...)不会返回sql.ErrNoRows,但原函数的错误处理可能忽略潜在问题,建议修改为:
func rowExists(db *sql.DB, query string, args ...interface{}) (bool, error) { var exists bool err := db.QueryRow("SELECT EXISTS("+query+")", args...).Scan(&exists) if err != nil { return false, fmt.Errorf("failed to check existence: %w", err) } return exists, nil }
避免字符串拼接带来的SQL注入风险,同时更准确地捕获错误。
4. UUID格式隐性问题
生成ApplicationID时,exec.Command("uuidgen").Output()返回的字节数组包含末尾换行符,虽然这不是rowExists返回false的直接原因,但会导致数据库中ApplicationID值异常,建议处理:
applicationIDBytes, err := exec.Command("uuidgen").Output() if err != nil { response := models.Response{Message: err.Error(), Status: "Error"} SendResponse(w, response) return } applicationID := strings.TrimSpace(string(applicationIDBytes))
内容的提问来源于stack exchange,提问作者Arjun Malhotra
相关产品推荐
相关产品推荐

