如何修复golang sql字符串转换扫描错误

我在查询 sqlite3 数据库中的一行时收到以下错误:


sql: Scan error on column index 3: converting string "" to a int64: strconv.ParseInt: parsing "": invalid syntax


查询本身有效,因为它能够返回查询的数据。我应该注意到数据库中的每一行都包含几个带有 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)

}

它依赖于以下常量和 var:


const userSelect  = "SELECT * FROM rsvp WHERE email = ?"

var userStatement   *sql.Stmt

非常感谢您对错误的任何帮助或洞察!


qq_遁去的一_1
浏览 275回答 1
1回答

蝴蝶刀刀

似乎您的一列(最有可能Rsvp)存储为字符串类型而不是 int 并且它被设置为""而不是null。因此,您要么必须更改Rsvp(可能是不同的列)sql.NullString,重做数据库以使数字字段具有空值而不是空字符串,或者如果您认为这是驱动程序中的错误,请在其跟踪器上打开一个问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go