Golang从MySQL数据库读取日期字段时遇到问题如何解决?

Golang从MySQL数据库读取日期字段时遇到问题如何解决? MySQL数据库:

image

Golang代码:

连接MySQL数据库

connection%20mysql%20db

查询所有客户

query%20all%20customers

打印查询结果

printing%20the%20query

运行查询后的错误

error%20after%20running%20query


更多关于Golang从MySQL数据库读取日期字段时遇到问题如何解决?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

根据我的理解,错误是因为表中存在 NULL 值,而你试图将其解析为日期,这是无法实现的。

更多关于Golang从MySQL数据库读取日期字段时遇到问题如何解决?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你可以使用 sql.NullString 来代替字符串类型。

https://golang.org/pkg/database/sql/#NullString

但也可以看看 sqlx 包,它允许将值提取到结构体中,而不是多个变量。

GitHub

GitHub

头像

jmoiron/sqlx

对 golang 的 database/sql 的通用扩展 - jmoiron/sqlx

在Go语言中从MySQL数据库读取日期字段时遇到类型转换错误是常见问题,主要原因是Go的database/sql包对时间类型有特定要求。MySQL的DATEDATETIMETIMESTAMP字段需要映射到Go的time.Time类型。

以下是完整的解决方案和示例代码:

package main

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

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

type Customer struct {
    ID        int
    Name      string
    Email     string
    CreatedAt time.Time
    UpdatedAt time.Time
}

func main() {
    // 连接MySQL数据库
    db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/database_name")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 验证连接
    err = db.Ping()
    if err != nil {
        log.Fatal(err)
    }

    // 查询所有客户
    rows, err := db.Query("SELECT id, name, email, created_at, updated_at FROM customers")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    var customers []Customer

    // 遍历查询结果
    for rows.Next() {
        var c Customer
        // 正确扫描日期字段到time.Time类型
        err := rows.Scan(&c.ID, &c.Name, &c.Email, &c.CreatedAt, &c.UpdatedAt)
        if err != nil {
            log.Fatal(err)
        }
        customers = append(customers, c)
    }

    // 检查遍历过程中是否有错误
    if err = rows.Err(); err != nil {
        log.Fatal(err)
    }

    // 打印查询结果
    for _, customer := range customers {
        fmt.Printf("ID: %d, Name: %s, Email: %s, CreatedAt: %s, UpdatedAt: %s\n",
            customer.ID, customer.Name, customer.Email,
            customer.CreatedAt.Format("2006-01-02 15:04:05"),
            customer.UpdatedAt.Format("2006-01-02 15:04:05"))
    }
}

如果数据库中的日期字段允许NULL值,需要使用sql.NullTime类型:

type Customer struct {
    ID        int
    Name      string
    Email     string
    CreatedAt sql.NullTime
    UpdatedAt sql.NullTime
}

// 在扫描时处理可能的NULL值
for rows.Next() {
    var c Customer
    err := rows.Scan(&c.ID, &c.Name, &c.Email, &c.CreatedAt, &c.UpdatedAt)
    if err != nil {
        log.Fatal(err)
    }
    
    // 检查时间字段是否有有效值
    if c.CreatedAt.Valid {
        fmt.Printf("Created: %s\n", c.CreatedAt.Time.Format("2006-01-02"))
    } else {
        fmt.Println("Created: NULL")
    }
}

确保已安装MySQL驱动:

go get -u github.com/go-sql-driver/mysql

关键点:

  • MySQL的日期时间字段必须映射到Go的time.Timesql.NullTime类型
  • 使用正确的连接字符串格式
  • Scan()操作中确保类型匹配
  • 处理可能的NULL值情况
回到顶部