如何在flyway创建的postgresql jdbc连接上设置时区?

Posted

技术标签:

【中文标题】如何在flyway创建的postgresql jdbc连接上设置时区?【英文标题】:How to set timezone on postgresql jdbc connection created by flyway? 【发布时间】:2020-02-05 16:03:57 【问题描述】:

我有一个 postgresql 数据库,我使用 flyway 部署脚本。我使用 maven flyway 插件来启动针对目标数据库的数据库构建。在那个构建中,我有执行以下操作的脚本:

create table my_table(
my_date_time timestamp with time zone not null
);

insert into my_table(my_date_time)
select '2000-01-01';

postgresql 数据库时区设置为 UTC。我的客户端机器(运行 maven/flyway 构建)正在运行 CEST (UTC+2:00)。

当脚本运行时,数据库将上面的字符串解释为 '1999-12-31 22:00:00+00:00' 并将其写入存储。

flyway 创建的 jdbc 客户端连接似乎没有将其客户端时区设置为 UTC,而是采用 timstamp 字符串并将其解释为 '2000-01-01 00:00:00+02:00'。

如何将flyway创建的jdbc连接上的客户端时区设置为UTC?有没有可以放在我的 flyway.conf 文件中的设置?

如果我将本地机器时区更改为 UTC,问题就会消失,但我不想在我的开发工作站上这样做。

【问题讨论】:

【参考方案1】:

与其只给它一个日期,postgres 必须解释它,还不如完全指定时间戳

insert into my_table(my_date_time)
select '2000-01-01T00:00:00+00';

如果这不可行,您可以尝试使用 -Duser.timezone=UTC 运行 mvn,但完全指定时间戳是更好的选择,因为它不会为误解或错误配置留下空间。

【讨论】:

我很想这样做,但是迁移已经应用到目标数据库并且更改它们会导致 flyway 抛出错误。当它们运行时,它们在设置为 UTC 的服务器上运行。此外,使用 -Duser.timezone=UTC 运行 mvn 会显示相同的问题。 好的,所以它们已经被错误地存储了。您可以创建另一个迁移来更正它们。 对不起,我不清楚。迁移已应用于 test/stage/prod 环境,但未应用于运行集成测试的本地环境。我考虑只在我的本地环境中添加一个迁移后步骤,但它并不完全明确我需要更新哪些记录,我宁愿首先让它应用正确的时区。【参考方案2】:

一位同事提出以下建议

mvn -Duser.timezone=UTC flyway:migrate

【讨论】:

【参考方案3】:

另一种方法是在迁移脚本本身中设置会话时区

SET timezone TO 'UTC';

【讨论】:

以上是关于如何在flyway创建的postgresql jdbc连接上设置时区?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用flyway创建数据库?

Flyway - 自动增量 ID 不适用于 PostgreSQL 中的测试数据

带有PostgreSQL,Flyway和Hikari的Spring Boot 2:驱动程序声称不接受jdbcUrl

在 JPA 中使用 Flyway 创建的序列

无法在 Spring Boot 中将 Flyway 迁移与 postgresQL 连接起来

PostgreSQL ‘数据库不存在’ - Java Spring Boot、Flyway、Docker/PostgreSQL