通过 JDBC URL 使用 TestContainers DB 但使用 @Rule 时出错

Posted

技术标签:

【中文标题】通过 JDBC URL 使用 TestContainers DB 但使用 @Rule 时出错【英文标题】:Error when using TestContainers DB via JDBC URL but works with @Rule 【发布时间】:2019-06-25 12:21:19 【问题描述】:

我正在尝试使用 TestContainers 进行集成测试。我开始使用它来实例化对象,例如:

@ClassRule
public static PostgreSQLContainer postgres = (PostgreSQLContainer) new PostgreSQLContainer()
        .withDatabaseName("producto")
        .withInitScript("init.sql");

这样我的实体类就可以完美运行。但是当我尝试按照here 的描述通过 JDBC URL 使用它时,我得到了以下异常

rg.postgresql.util.PSQLException: ERROR: cross-database references are not implemented: "producto.producto.driver"

我正在使用 Spring Boot,因此我在 application.properties 中定义了以下属性以利用 Spring Boot 自动配置(不再在代码中定义容器):

spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDrive
spring.datasource.url=jdbc:tc:postgresql://somehostname:someport/producto?TC_INITSCRIPT=init.sql

我的实体类定义为:

@Entity
@Table(name = "driver", schema = "producto", catalog = "producto")
public class DriverEntity  

我真的不明白为什么它在定义对象时有效,但在使用 jdbc url 时却不行。

¿我需要定义其他属性吗?

【问题讨论】:

我也遇到了同样的问题(虽然不同的错误信息)。您找到解决方案了吗? 【参考方案1】:

从 JDBC URL 启动时,数据库名称将为“test”(Testcontainers 会忽略 JDBC URL 中的数据库名称)。

在您的代码中,您对数据库名称进行了硬编码,不建议这样做,因为您可能在具有不同数据库名称的不同环境中运行您的应用程序。

尝试从注释中删除数据库名称。

【讨论】:

文档说数据库名称被忽略,但这实际上并不正确。 spring.datasource.url=jdbc:tc:postgresql:10.16://somehost:12345/bla?TC_REUSABLE=true 将创建一个名为 'bla' 而不是 'test' 的数据库【参考方案2】:

错字。

org.testcontainers.jdbc.ContainerDatabaseDrive 应该 org.testcontainers.jdbc.ContainerDatabaseDriver

【讨论】:

以上是关于通过 JDBC URL 使用 TestContainers DB 但使用 @Rule 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Hive 通过 Jdbc 连接 HiveServer2

jdbc链接基础

JDBC各种数据库连接URL关键代码

zeroDateTimeBehavior=convertToNull 在使用休眠的 jdbc url 中不起作用

使用 keytab 文件连接到 Impala 的 jdbc URL

通过 JDBC 进行并行化 - Pyspark - 并行化如何使用 JDBC 工作?