【发布时间】:2019-02-27 00:36:30
【问题描述】:
我在执行查询时遇到了一些非常奇怪的不一致,想知道是否有人知道原因。
假设我有一个定义如下的结构:
type Result struct {
Afield string `db:"A"`
Bfield interface{} `db:"B"`
Cfield string `db:"C"`
Dfield string `db:"D"`
}
还有一个包含以下列的 MySQL 表:
A : VARCHAR(50)
B : INT
C : VARCHAR(50)
D : VARCHAR(50)
我要执行的查询:
从表 WHERE A="a" 中选择 A、B、C、D
第一种执行方式:
db.Get(&result, `SELECT A, B, C, D FROM table WHERE A="a"`)
第二种执行方式:
db.Get(&result, `SELECT A, B, C, D FROM table WHERE A=?`, "a")
我遇到的不一致如下:第一种方式执行查询时,Bfield的类型为int。但是,第二次执行查询时,是[]uint8。
例如,当 B 为 1 时,就会发生这种结果。
为什么 Bfield 的类型会根据查询的执行方式而有所不同?
连接声明:
// Connection is an interface for making queries.
type Connection interface {
Exec(query string, args ...interface{}) (sql.Result, error)
Get(dest interface{}, query string, args ...interface{}) error
Select(dest interface{}, query string, args ...interface{}) error
}
编辑
使用 Go 数据库/sql 包 + 驱动程序也会发生这种情况。下面的查询分别将Bfield 分配给[]uint8 和int64。
db 是 *sql.DB 类型
查询1:
db.QueryRow(SELECT A, B, C, D FROM table WHERE A="a").Scan(&result.Afield, &result.Bfield, &result.Cfield, &result.Dfield)
--> Bfield 的类型是[]uint8
查询 2:
db.QueryRow(SELECT A, B, C, D FROM table WHERE A=?, "a").Scan(&result.Afield, &result.Bfield, &result.Cfield, &result.Dfield)
--> Bfield 的类型是int64
编辑
还有一点需要注意,当链接多个 WHERE 子句时,只要使用? 填充至少 1,查询将返回int。否则,如果它们都填充在字符串中,它将返回[]uint8
【问题讨论】:
-
你的意思是
Bfield吗? -
您使用的是哪个数据库(和驱动程序)包?
-
我正在导入 Go "database/sql" 包。是的,我为 Bfield 更新了
-
更正:我正在使用github.com/jmoiron/sqlx驱动程序@leafbebop