【问题标题】:How to fix golang sql string conversion scan error如何修复golang sql字符串转换扫描错误
【发布时间】:2014-11-22 14:01:10
【问题描述】:

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

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

查询本身有效,因为它能够返回查询的数据。我应该注意,数据库中的每一行都包含几个带有 NULL 数据的列(仅填充了 IdEmail 列)。我正在努力理解为什么会发生错误以及如何解决它。

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

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

【问题讨论】:

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

标签: sql sqlite go


【解决方案1】:

您的一列(很可能是Rsvp)似乎存储为字符串类型而不是int,并且设置为""而不是null

因此,您要么必须将Rsvp(可能是不同的列)更改为sql.NullString,重做数据库以使数字字段具有空值而不是空字符串,或者如果您认为这是驱动程序中的错误,请打开一个他们的跟踪器上的问题。

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多