【问题标题】:JOOQ timestamp field default value different from the db default valueJOOQ 时间戳字段默认值与数据库默认值不同
【发布时间】:2019-05-02 00:23:12
【问题描述】:

我有一个带有下表的 postgreSQL 数据库

CREATE TABLE IF NOT EXISTS user_acc
(
  name          TEXT                  NOT NULL,
  updated       TIMESTAMP             DEFAULT now()
);

并且,在使用 JOOQ 时,数据插入如下(Kotlin 语言

val record = create.newRecord(USER_ACC)
record.name = "username"
record.store()

并且记录被正确插入到数据库中,默认时间戳值从 now() 开始。

------------------------------------------
| user      | updated                    |
------------------------------------------
|username   |2018-11-29 14:14:52.635838  |
------------------------------------------

问题是,执行上述 JOOQ 语句的进程与数据库所在的服务器不同。两者都在不同的时区。

因此,如果我通过连接到数据库直接插入记录,则默认时间戳(从 now() 开始)与 JOOQ 插入的时间戳相差数小时。

我相信这是因为,在 JOOQ 的自动生成类中,updated 字段生成为

 /**
 * The column <code>user_acc.updated</code>.
 */
 public final TableField<UserAccRecord, LocalDateTime> UPDATED = createField("updated", org.jooq.impl.SQLDataType.LOCALDATETIME.defaultValue(org.jooq.impl.DSL.field("now()", org.jooq.impl.SQLDataType.LOCALDATETIME)), this, "");

这是否会在服务端生成当前时间戳(for now()),而不是由数据库生成默认时间戳?如果是这样,我怎样才能让 JOOQ 跳过这个,并使用数据库的 now() 值?

感谢您的帮助!

【问题讨论】:

    标签: postgresql jooq


    【解决方案1】:

    这不是一个真正的 jOOQ 问题 - 如果您按照您描述的方式插入记录,那么 jOOQ 不会对该时间戳做任何事情。它由数据库生成,然后可能会被取回给客户端。但请注意,它属于TIMESTAMP WITHOUT TIME ZONE 数据类型,在您读取该值的任何时区,其值为2018-11-29 14:14:52.635838。因此,取决于客户端的不同时期值。这不一定有用 - 防止这种情况的最佳方法是改用 TIMESTAMP WITH TIME ZONE 数据类型,在 PostgreSQL 中它只是一个简单的 UTC 时间戳。

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多