mysql - 如何将 .Scan() MySQL TIMESTAMP 值转换为 time.Time 变量?

标签 mysql go

我有这个 Go 代码:

package main

import (
    "fmt"
    "database/sql"
    _"github.com/go-sql-driver/mysql"
    "time"
)

type User struct {
    id                  uint32
    name                string
    email               string
    rating              uint8
    subscription        uint8
    date_registered     time.Time
    online              string
}

// main entry point
func main() {
    // setup db connection
    db, err := sql.Open("mysql", "user:@tcp(127.0.0.1:3306)/c9?parseTime=true")
    if err != nil {
        fmt.Println(err)
    }
    defer db.Close()

    // query
    rows, err := db.Query("SELECT * FROM users WHERE id = ?", 1)
    if err != nil {
        fmt.Println(err)
    }
    defer rows.Close()

    usr := User{}
    for rows.Next() {
        err := rows.Scan(&usr.id, &usr.name, &usr.email, &usr.rating, &usr.subscription, &usr.date_registered, &usr.online)
        if err != nil {
            fmt.Println(err)
        }
    }
    fmt.Println(usr)
    err = rows.Err()
    if err != nil {
        fmt.Println(err)
    }
}

这是我从 MySQL 控制台得到的:

mysql> describe users;
+-----------------+---------------------+------+-----+-------------------+----------------+
| Field           | Type                | Null | Key | Default           | Extra          |
+-----------------+---------------------+------+-----+-------------------+----------------+
| id              | int(10) unsigned    | NO   | PRI | NULL              | auto_increment |
| name            | varchar(50)         | NO   |     | NULL              |                |
| email           | varchar(50)         | NO   |     | NULL              |                |
| rating          | tinyint(3) unsigned | YES  |     | NULL              |                |
| subscription    | tinyint(3) unsigned | NO   |     | 0                 |                |
| date_registered | timestamp           | NO   |     | CURRENT_TIMESTAMP |                |
| online          | char(1)             | NO   |     | N                 |                |
+-----------------+---------------------+------+-----+-------------------+----------------+
7 rows in set (0.00 sec)

mysql> SELECT * FROM users;
+----+------------+-----------------------+--------+--------------+---------------------+--------+
| id | name       | email                 | rating | subscription | date_registered     | online |
+----+------------+-----------------------+--------+--------------+---------------------+--------+
|  1 | alakhazamm | abcdefghhhh@gmail.com |   NULL |            0 | 2014-10-28 15:37:44 | N      |
+----+------------+-----------------------+--------+--------------+---------------------+--------+
1 row in set (0.00 sec)

.Scan() 之后, fmt.Println(usr)打印

{1 alakhazamm abcdefghhhh@gmail.com 0 0 {0 0 <nil>} }

结构的最后两个字段是错误的,但我不知道为什么。 我试过使用 date_registered string在结构定义中,但我在 .Scan() 之后得到一个空字符串. 我还在驱动程序文档中读到 ?parseTime=true将 MySQL DATE 和 DATETIME 值解析为 time.Time,但它们没有提及我当前正在使用的 TIMESTAMP。

我是否遗漏了一些重要的东西,或者它是库的错误/缺失的功能?

最佳答案

我知道这是一个老问题,但是我在 Open 调用中遗漏了这个参数:

parseTime=true

See here

关于mysql - 如何将 .Scan() MySQL TIMESTAMP 值转换为 time.Time 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26617957/

相关文章:

php - mysql和重复条目报告

mongodb 聚合在 golang 中给出错误

go - Go 中的 .a 文件是什么?

xml - golang中如何将编码为UTF-16的xml转换为UTF-8

javascript - 仅在 mouseenter 上显示第一个类别的 div

php - 在 PHP 中打印 MySQL 查询

go - Ginkgo 跳过规范算作失败

amazon-web-services - 找不到 Golang 的 API 网关映射模板

PHP/MySQL 将文本数据类型的时间戳转换为可用的日期格式

mysql - 根据用户注册月份的日期每月选择记录