2014-09-27 134 views
2

在sqlite3的数据库查询行时我收到以下错误:如何修复golang SQL字符串转换扫描错误

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具有以下结构定义

(I加入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) 
} 

其依赖于下面的C onstant和var:

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

任何帮助或对错误的深入了解都非常感谢!

+2

尝试在您的SQL SELECT语句中显式使用而不是使用'*'。这将有助于排除列不匹配。 – jmaloney 2014-09-27 20:02:48

+0

我已经使SQL SELECT显式,但仍然收到相同的错误:'sql:扫描列索引3错误:将字符串“”“转换为int64:strconv.ParseInt:解析”“:无效语法' – surfearth 2014-09-27 20:14:39

回答

3

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

所以,你要么必须改变Rsvp(可能是不同的列)以sql.NullString,重做数据库具有空的,而不是数字字段,或者如果你相信它在驱动程序中的错误空字符串,打开一个问题,他们跟踪器。