golang处理mysql中null值的坑

报错

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)
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容