【问题标题】:Is it possible to edit schema and db name of org.testcontainers.containers.PostgreSQLContainer?是否可以编辑 org.testcontainers.containers.PostgreSQLContainer 的架构和数据库名称?
【发布时间】:2022-01-23 14:57:38
【问题描述】:

我正在使用 TestContainers 的 PostgreSQLContainer 来测试 Spring 应用程序,并且我想将数据库配置为具有特定的架构和数据库名称。默认值为 db_name=test 和 schema=public

是否可以编辑这些?那么,在哪里以及如何?

我有一个application.properties 文件:

spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}

start() 方法的我的 PostgreSQLContainer 实现:

import org.testcontainers.containers.PostgreSQLContainer;
public class DefaultPostgresContainer extends PostgreSQLContainer<DefaultPostgresContainer> {



private static final String IMAGE_VERSION = "postgres:13";
private static DefaultPostgresContainer container;

private DefaultPostgresContainer() {
        super(IMAGE_VERSION);
}

public static DefaultPostgresContainer getInstance() {
    if (container == null) {
        container = new DefaultPostgresContainer().withInitScript("init_postgresql.sql");
    }
    return container;
}

@Override
public void start() {
    super.start();
    System.setProperty("DB_URL", container.getJdbcUrl());
    System.setProperty("DB_USERNAME", "my_test");
    System.setProperty("DB_PASSWORD", "my_test");
}

@Override
public void stop() {
    //do nothing, JVM handles shutdown
}
}

【问题讨论】:

  • 您可以使用withDatabaseName配置数据库名称。 Schema 是 PostgreSQL 的问题,而不是 testcontainers 的问题,因此您需要像使用“普通”数据库一样解决这个问题。

标签: java spring postgresql testcontainers


【解决方案1】:

正如在 cmets 中提到的,withDatabaseName() 方法将为您提供一种设置与默认值不同的名称的方法。因此,在您的情况下,您可以简单地执行以下操作:

public static DefaultPostgresContainer getInstance() {
    if (container == null) {
        container = new DefaultPostgresContainer()
                             .withInitScript("init_postgresql.sql")
                             .withDatabaseName("mydatabase");
    }
    return container;
}

在 cmets 中也已经给出了使用模式的提示:可以通过 JDBC 轻松管理自定义模式(您必须在使用之前创建它)。

要在与PostgreSQLContainer 的 JDBC 连接中选择自定义架构作为“默认”,您可以执行以下操作:

Properties properties = new Properties();
properties.setProperty("user", psqlContainer.getUsername());
properties.setProperty("password", psqlContainer.getPassword());
properties.setProperty("currentSchema", SCHEMA_NAME);    // this sets the "default" schema for queries
final Connection connection = DriverManager.getConnection(psqlContainer.getJdbcUrl(), properties);

如果你想看到它的实际效果,我已经将 some simple test cases 放在一起展示了这里解释的机制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2020-12-09
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多