golang处理mysql中null值的坑

629 阅读2分钟

报错

Scan error on column index 9, name "extra": converting NULL to string is unsupported

处理办法

这个错误是因为你尝试将数据库中的 NULL 值直接转换为 Go 中的 string 类型,这是不允许的。为了解决这个问题,你可以使用 sql.NullString 类型来接收可能为 NULL 的字段值,然后根据实际情况将其转换为字符串。以下是如何处理这个错误的示例:

假设你的查询结果包含可能为 NULL 的字段 extra,你可以这样处理

import (
    "database/sql"
    "fmt"
    "log"
)

type MyData struct {
    // 其他字段
    Extra string
}

func main() {
    var extra sql.NullString

    // 假设你已经执行了查询,并将结果存储在 rows 中
    err := rows.Scan(/* 其他字段, */ &extra)
    if err != nil {
        log.Fatalf("Scan error: %v", err)
    }

    // 将 sql.NullString 转换为 string
    var extraStr string
    if extra.Valid {
        extraStr = extra.String
    } else {
        extraStr = "" // 或者你可以为 NULL 值设置默认字符串
    }

    // 存储到结构体中
    data := MyData{
        // 其他字段
        Extra: extraStr,
    }

    fmt.Printf("Data: %+v\n", data)
}
在这个示例中,我们首先使用 sql.NullString 类型变量 extra 来接收可能为 NULL 的字段值。然后,我们检查 extra.Valid 来判断字段值是否为 NULL。如果不是 NULL,我们将 extra.String 赋值给 extraStr,否则将其设置为空字符串(或者你可以为 NULL 值设置默认字符串)。最后,我们将处理后的字符串值存储到结构体中。你可以根据实际情况修改和扩展这个示例。

插入

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

type MyData struct {
	Extra sql.NullString
}

func main() {
	// 假设已经建立了数据库连接
	db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/dbname")
	if err != nil {
		log.Fatalf("Failed to connect to database: %v", err)
	}
	defer db.Close()

	// 创建一个 MyData 结构体实例,其中 Extra 为非 NULL
	data := MyData{
		Extra: sql.NullString{String: "some extra data", Valid: true},
	}

	// 插入数据
	query := "INSERT INTO conn_session (extra) VALUES (?)"
	result, err := db.Exec(query, data.Extra)
	if err != nil {
		log.Fatalf("Failed to insert data: %v", err)
	}

	// 输出插入的行数
	rowsAffected, _ := result.RowsAffected()
	fmt.Printf("Rows inserted: %d\n", rowsAffected)
}