mysql时间戳错误与time.Now()golang

时间:2017-08-05 19:13:49

标签: go

如何将time.Now()保存在mysql表中,列名保存为created_at timestamp null

我收到错误:

Error:Error 1292: Incorrect datetime value: '2017-08-05 19:06:14.190 +0000' for column 'created_at' at row 1

提供的更多信息: - (我正在使用fragmenta cms,所以所有参考代码及其行号都在下面给出)

表架构: -

mysql> describe users;
+----------------------+--------------+------+-----+---------+----------------+
| Field                | Type         | Null | Key | Default | Extra          |
+----------------------+--------------+------+-----+---------+----------------+
| id                   | int(11)      | NO   | PRI | NULL    | auto_increment |
| created_at           | timestamp    | YES  |     | NULL    |                |
| updated_at           | timestamp    | YES  |     | NULL    |                |
| status               | int(11)      | YES  |     | NULL    |                |
| role                 | int(11)      | YES  |     | NULL    |                |
| name                 | varchar(250) | YES  |     | NULL    |                |
| email                | varchar(250) | YES  |     | NULL    |                |
| title                | varchar(250) | YES  |     | NULL    |                |
| summary              | text         | YES  |     | NULL    |                |
| text                 | text         | YES  |     | NULL    |                |
| image_id             | int(11)      | YES  |     | NULL    |                |
| password_hash        | varchar(250) | YES  |     | NULL    |                |
| password_reset_token | text         | YES  |     | NULL    |                |
| password_reset_at    | timestamp    | YES  |     | NULL    |                |
+----------------------+--------------+------+-----+---------+----------------+

运行它以保存的代码: -

在第号行。 62这里(https://github.com/fragmenta/fragmenta-cms/blob/master/src/pages/actions/setup.go#L62

它调用代码 user := users.New()

在行号。 51 at file here(https://github.com/fragmenta/fragmenta-cms/blob/master/src/users/query.go#L51

设置了

New()功能。

这就像: -

func New() *User {
    user := &User{}
    user.CreatedAt = time.Now()
    user.UpdatedAt = time.Now()
    user.TableName = TableName
    user.KeyName = KeyName
    user.Status = status.Draft
    return user
}

和他们的连接/ mysql开放模式位于此处(https://github.com/fragmenta/query/blob/master/adapters/database_mysql.go#L23)。

2 个答案:

答案 0 :(得分:1)

您正尝试使用字符串query.go:36

插入它
now := query.TimeString(time.Now().UTC())

由您使用的包database.go:59生成:

return t.Format("2006-01-02 15:04:05.000 -0700")

MySQL期望它采用yyyy-MM-dd hh:mm:ss模式,使用以下代码段将模式应用于当前Time.time对象:

now := time.Now().UTC().Format("2006-01-02 03:04:05")

无论如何,为什么不在插入记录时使用SQL函数NOW()

答案 1 :(得分:1)

https://github.com/fragmenta/query中存在错误。 TimeString中的query/adapters/database.go方法对所有DBMS适配器都无效。

// TimeString - given a time, return the standard string representation
func (db *Adapter) TimeString(t time.Time) string {
    return t.Format("2006-01-02 15:04:05.000 -0700")
}

它对MySQL时间戳无效:MySQL 5.7 Reference Manual, 11.3.1 The DATE, DATETIME, and TIMESTAMP TypesTimeString中的MySQL query/adapters/database_mysql.go方法应为:

// TimeString - given a time, return the MySQL standard string representation
func (db *MysqlAdapter) TimeString(t time.Time) string {
    return t.Format("2006-01-02 15:04:05.999999")
}