在golang

时间:2017-03-30 06:18:02

标签: mysql go

我做了什么: 1.exec sql查询并在db ddl之后扫描到struct时获取错误的时间戳数据。 SQL: SELECT state,round,remark,ctime FROM archive_track WHERE aid=? ORDER BY id DESC 结构:

type Archive struct {
    Timestamp time.Time `json:"timestamp"`
    State int `json:"state"`
    Round int `json:"round"`
    Remark string `json:"remark,omitempty"`
}

去代码:

a:=&Archive{}
 rows.Scan(&a.State, &a.Round, &a.Remark, &a.Timestamp)

mysql表信息:

CREATE TABLE `archive_track` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT ,
  `aid` int(11) NOT NULL DEFAULT '0' ,
  `state` tinyint(11) DEFAULT NULL,
  `round` tinyint(4) NOT NULL DEFAULT '0' ,
  `remark` text COMMENT '其他信息',
  `ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  `mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  `attribute` mediumint(8) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `ix_aid` (`aid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

表数据:

| id |援助|国家|圆|备注| ctime | mtime |属性|

|:--- | --- | --- | --- | --- | --- | --- | ---:|

| 1 | 1 | 1 | 1 | "" | 2017-03-27 17:07:10 | 2017-03-27 17:07:10 | 0 |

我可以先得到正确的数据:

&a{aid:1,state:1,round:1 ,ctime:1490605630} 但是在db ttl之后得到错误的数据(将state(tinyint)修改为state(int)):

&a{aid:0,state:0,round:0,ctime:-62135596800}.

db ttl:

alter table archive_track modify state int

在重新启动程序之前,我无法获得正确的数据。 重新启动后,我可以获得正确的数据,错误的数据不再出现,但为什么。这让我感到困惑。

配置

*驱动程序版本(或git SHA):QD6LqgLz2JMxXqns8TaxtK9AuHs =

*转到版本:go1.7.4

服务器版本:例如MySQL 5.6,

*服务器操作系统:Linux版本3.16.0-4-amd64

1 个答案:

答案 0 :(得分:0)

如果您使用gomysql作为数据库驱动程序,那么当您连接到数据库时,似乎没有为驱动程序启用parseTime DSN parameter

默认情况下,gomysql不会将Go类型time.Time扫描到结构中,但它是作为DSN参数实现的。试试这个连接字符串:

connectionString := fmt.Sprintf(`%s:%s@tcp(%s:%s)/%s?parseTime=true`,
        DBUsername,
        DBPassword,
        DBHost,
        DBHostPort,
        DBName)