我第一次尝试使用golang来查询MySQL数据库,但是当我运行命令go run main.go
时出现以下错误。
2017/10/22 21:06:58 sql:列索引4上的扫描错误:不支持 扫描,存储driver.Value类型为* string exit status 1
这是我的main.go
main.go
package main
import (
"log"
"database/sql"
)
import _ "github.com/go-sql-driver/mysql"
var db *sql.DB
var err error
// main function to boot up everything
func main() {
var dbField,dbType,dbNull,dbKey,dbDefault,dbExtra string
// Create an sql.DB and check for errors
db, err = sql.Open("mysql", "username:password@/mydatabase")
if err != nil {
panic(err.Error())
}
rows, err := db.Query("DESCRIBE t_user")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(&dbField,&dbType,&dbNull,&dbKey,&dbDefault,&dbExtra)
if err != nil {
log.Fatal(err)
}
log.Println(dbField,dbType,dbNull,dbKey,dbDefault,dbExtra)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
// sql.DB should be long lived "defer" closes it once this function ends
defer db.Close()
}
当我从mysql终端运行DESCRIBE t_user
时,我得到了这些结果:
+------------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+---------------------+------+-----+---------+----------------+
| user_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| first_name | varchar(50) | NO | | NULL | |
| middle_name | varchar(50) | NO | | NULL | |
| last_name | varchar(50) | NO | | NULL | |
| email | varchar(50) | NO | UNI | NULL | |
+------------------------+---------------------+------+-----+---------+----------------+
我似乎无法弄清楚造成这个问题的原因。是因为列键,默认,额外有时返回空字符串或空值?我尝试做var dbNull nil
之类的事情,但编译器说nil
不是类型,所以如果问题与需要接受可空值的dbNull
有关,golang如何解决这种情况?如果这不是问题,我感谢任何其他见解
答案 0 :(得分:0)
索引4是Default
列,可以为空。你给它放置一个字符串的地址,但它需要放置NULL。解决方案是使用sql.NullString
之类的东西,而不只是字符串。
答案 1 :(得分:0)
提到Gavin
,
您需要使用处理空值的类型,例如sql.NullString
。
作为替代方案,您还可以使用一种新类型来实现处理空值的db.Scanner
接口。
type dbNullString string
func (v *dbNullString) Scan(value interface{}) error {
if value == nil {
*v = ""
return nil
}
if str, ok := value.(string); ok {
*v = dbNullString(str)
return nil
}
return errors.New("failed to scan dbNullString")
}
另请注意,您需要实现driver.Valuer
接口以使用此类型插入值。