如何解决 Golang SQL 字符串转换扫描错误

3
我在查询sqlite3数据库中的一行时遇到以下错误:
sql: 在第3列索引上扫描错误:将字符串“”转换为int64:strconv.ParseInt:解析“”:无效的语法
查询本身可以正常工作,因为它能够返回查询的数据。值得注意的是,数据库中的每一行都包含几个具有NULL数据的列(只有Id和Email列被填充)。我很难理解为什么会出现这个错误以及如何解决它。
SQL表格具有以下九个列:
`0,Id,INTEGER,0,,1
1,Email,TEXT,0,,0
2,Name,TEXT,0,,0
3,Rsvp,INTEGER,0,,0
4,Guests,INTEGER,0,,0
5,Meal0,INTEGER,0,,0
6,Meal1,INTEGER,0,,0
7,Comments,TEXT,0,,0
8,ModifiedAt,TEXT,0,,0`

以下结构体定义在server.go中(我添加了sql.NullString以处理空列):

type User struct {
    Id         int
    Email      string
    Name       sql.NullString
    Rsvp       sql.NullInt64
    Guests     sql.NullInt64
    Meal0      sql.NullInt64
    Meal1      sql.NullInt64
    Comments   sql.NullString
    ModifiedAt sql.NullString
}

查询来自以下处理程序:

func Rsvp1Handler(w http.ResponseWriter, r *http.Request) {
  email := r.URL.Path[len("/rsvp/"):]
  var user User
  err := userStatement.QueryRow(email).Scan(&user.Id, &user.Email, &user.Name, &user.Rsvp, &user.Guests, &user.Meal0, &user.Meal1, &user.Comments, &user.ModifiedAt)

  switch {
  case err == sql.ErrNoRows:
    log.Println("No user with that ID.")
    w.Header().Set("Content-Type", "text/plain")
    fmt.Fprintf(w, "Email address not found: %s", email)

  case err != nil:
    log.Println(err)
    fmt.Fprintf(w, "Database error:\n", err)
  default:
    log.Println("Query success. Email address: ", email)
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(&user)
}

这需要以下常量和变量的支持:

const userSelect  = "SELECT * FROM rsvp WHERE email = ?"
var userStatement   *sql.Stmt

任何关于错误的帮助或见解都将不胜感激!

2
尝试在SQL SELECT语句中明确指定列,而不是使用*。这将有助于排除列不匹配的情况。 - jmaloney
我已经明确指定了SQL SELECT,但仍然收到相同的错误:sql: Scan error on column index 3: converting string "" to a int64: strconv.ParseInt: parsing "": invalid syntax - surfearth
1个回答

3

看起来你的某一列(很可能是 Rsvp)存储为字符串类型而不是整数,并且设置为 "" 而不是 null

所以你需要将 Rsvp(可能是其他列)更改为 sql.NullString,重新设计数据库以在数字字段中使用 null 而不是空字符串,或者如果你认为这是驱动程序的错误,请在其跟踪器上提出问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接