2014-01-22 98 views
0

我在golang中使用sqlx,这是非常有用的,但它似乎不会抛出错误,当我使用结构扫描和结构的类型不匹配的SQL类型。比如我在这里建立一个数据库,有一个名称(字符串)和年龄(INT):Golang Sqlx不抛出错误

+-------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| name | varchar(255) | NO |  | NULL |  | 
| age | int(11)  | NO |  | NULL |  | 
+-------+--------------+------+-----+---------+-------+ 
+------+-----+ 
| name | age | 
+------+-----+ 
| bob | 10 | 
+------+-----+ 

然后我用SQLX读出值转换成一个结构,但结构有错误的类型。

package main 

import (
    "log" 
    "github.com/jmoiron/sqlx" 
    _ "github.com/go-sql-driver/mysql" 
) 

// in database name is a string and age is an int 

type Person struct{ 
    Name int 
    Age string 
} 

func main() { 
    sqlSession, err := sqlx.Open("mysql", "root:@(localhost:3306)/dashboard?parseTime=true") 
    if err != nil { 
    log.Panic(err) 
    } 
    err = sqlSession.Ping() 
    if err != nil { 
    log.Panic(err) 
    } 
    query := "SELECT * FROM test" 
    rows, errSql := sqlSession.Queryx(query) 
    if errSql != nil { 
    log.Panic(errSql) 
    } 
    for rows.Next() { 
    var p Person 
    errScan := rows.StructScan(&p) 
    if errScan != nil { 
     log.Panic(errScan) 
    } 
    log.Println("Person:", p) 
    } 
} 

所以不是给我一个错误,它已经清零了值。人员:{0}

是否有其他人遇到此问题?其他人是否认为这是一个错误?我认为当我尝试扫描到无效类型时,它应该会给我一个错误。

回答

0

我怀疑这是一个副作用,当它找不到放置返回值的地方时决定不返回错误。您可能不想返回错误的一个原因是,如果您执行“select *”操作,那么即使您的结构包含所有列,如果代码不立即开始返回错误,您将无法添加新列。

有人可能会争辩说,如果全部查询列未使用,那么它应该返回一个错误。这个项目可能会带来一个问题,那就是要走了。

+0

感谢您的回答,我会尝试打开并发布,看看它是如何发展。 – Gary