【问题标题】:mysql timestamp error with time.Now() golangmysql时间戳错误与time.Now()golang
【发布时间】:2017-08-05 19:13:48
【问题描述】:

如何在mysql表中保存time.Now(),列名为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    |                |
+----------------------+--------------+------+-----+---------+----------------+

运行它以保存的代码:-

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

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

在第 1 行。 51 在文件中 (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)。

【问题讨论】:

  • 在您的 MySQL 连接字符串中包含 parseTime=True 并尝试。
  • charset=utf8&parseTime=true 已经存在
  • 您能分享一下您的数据库架构吗?
  • 那么这是 MySQL DB 时区设置问题而不是 Go 问题。请检查您的数据库设置。
  • 如果有帮助 - 我正在使用 fragmenta CMS 和 mysql

标签: go


【解决方案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 的模式,使用以下 sn-p 将模式应用于您当前的Time.time 对象:

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

那么,插入记录的时候为什么不用SQL函数NOW()呢?

【讨论】:

  • 即使将其更改为time.Now().UTC() - 它也不会改变任何内容。
  • 能否请您打开github.com/fragmenta/query/blob/master/query.go#L22 上的Debug 标志并告诉生成的查询是什么?
  • 默认情况下它处于调试模式,并给出与我在问题File:src/pages/actions/setup.go:65 Error:Error 1292: Incorrect datetime value: '2017-08-05 21:51:07.723 +0000' for column 'created_at' at row 1中提到的相同的错误@
  • 我提到的布尔值应该为你打印出生成的查询
  • 不!它没有 - 它只给出带有文件名和行号的错误消息。
【解决方案2】:

https://github.com/fragmenta/query 中有一个错误。 query/adapters/database.go 中的 TimeString 方法不适用于所有 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 Typesquery/adapters/database_mysql.go 中的 MySQL TimeString 方法应该是:

// 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")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2016-07-17
    • 2015-06-03
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多