2014-09-27 34 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,重做數據庫具有空的,而不是數字字段,或者如果你相信它在驅動程序中的錯誤空字符串,打開一個問題,他們跟蹤器。