猿问

扫描到无效类型时,Sqlx 不会抛出错误

我在 Go 中使用 sqlx,这很有帮助,但是当我使用 struct scan 并且结构的类型与 sql 类型不匹配时,它似乎不会抛出错误。例如,我在这里设置了一个数据库以具有名称(字符串)和年龄(整数):


+-------+--------------+------+-----+---------+-------+

| 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}


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


慕丝7291255
浏览 223回答 1
1回答

拉莫斯之舞

我怀疑这是在找不到放置返回值的位置时决定不返回错误的副作用。您可能不想返回错误的一个原因是,如果您执行“select *”,那么即使您的结构具有所有列,您也将无法添加新列,而代码会立即开始返回错误。有人可能会争辩说,如果所有查询列都未使用,那么它应该返回一个错误。可能打开项目的问题将是要走的路。
随时随地看视频慕课网APP

相关分类

Go
我要回答