golang mysql DESCRIBE表导致driver.Value类型为nil错误

时间:2017-10-23 01:11:01

标签: mysql go

我第一次尝试使用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如何解决这种情况?如果这不是问题,我感谢任何其他见解

2 个答案:

答案 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接口以使用此类型插入值。