我第一次尝试使用 golang 查询 MySQL 数据库,但是当我运行命令 go run main.go
时出现以下错误。
2017/10/22 21:06:58 sql: Scan error on column index 4: unsupported Scan, storing driver.Value type into type *string exit status 1
这是我的 main.go
主.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 | |
+------------------------+---------------------+------+-----+---------+----------------+
我似乎无法弄清楚是什么导致了这个问题。是因为 columns key, default, extra 有时会返回空字符串或 null 值吗?我尝试做类似 var dbNull nil
的操作,但编译器说 nil
不是类型,因此如果问题与 dbNull
相关,则需要接受可为空的值,golang 如何解决这种情况?如果这不是问题所在,我感谢任何其他见解
最佳答案
索引 4 是 Default
列,可以为空。你给它一个地址来放置一个字符串,但它需要放置 NULL。解决方案是使用类似 sql.NullString
的东西,而不仅仅是一个字符串。
关于mysql - golang mysql DESCRIBE表导致driver.Value type nil错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46880695/