Testcontainers 执行 SQL 脚本:两种方法详解
Testcontainers \u662f\u4e00\u4e2a\u7528\u4e8e\u5728\u6d4b\u8bd5\u73af\u5883\u4e2d\u542f\u52a8\u52a8\u6001\u5bb9\u5668\u7684\u003Ccode\u003EJava\u003C/code\u003E\u5e93\u3002\u5b83\u53ef\u4ee5\u7528\u4e8e\u6267\u884c\u003Ccode\u003ESQL\u003C/code\u003E\u89e3\u6790\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff1a\n\n1. \u4f7f\u7528\u003Ccode\u003ETestcontainers\u003C/code\u003E\u63d0\u4f9b\u7684\u003Ccode\u003EJDBC\u003C/code\u003E\u5bb9\u5668\uff0c\u5728\u6d4b\u8bd5\u542f\u52a8\u7684\u52a8\u6001\u5bb9\u5668\u4e2d\u8fd0\u884c\u003Ccode\u003ESQL\u003C/code\u003E\u89e3\u6790\u3002\u9996\u5148\uff0c\u9700\u8981\u5bfc\u5165\u003Ccode\u003ETestcontainers\u003C/code\u003E\u7684\u4f9d\u8d56\uff1a\n\n\u003Ccode\u003Exml\n\u003Cdependency\u003E\n \u003CgroupId\u003Eorg.testcontainers\u003C/groupId\u003E\n \u003CartifactId\u003Etestcontainers\u003C/artifactId\u003E\n \u003Cversion\u003E1.16.0\u003C/version\u003E\n \u003Cscope\u003Etest\u003C/scope\u003E\n\u003C/dependency\u003E\n\u003C/code\u003E\n\n\u7136\u540e\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u7684\u4ee3\u7801\u5728\u6d4b\u8bd5\u4e2d\u6267\u884c\u003Ccode\u003ESQL\u003C/code\u003E\u89e3\u6790\uff1a\n\n\u003Ccode\u003Ejava\nimport org.junit.jupiter.api.Test;\nimport org.testcontainers.containers.GenericContainer;\nimport org.testcontainers.containers.JdbcDatabaseContainer;\nimport org.testcontainers.containers.PostgreSQLContainer;\nimport org.testcontainers.containers.wait.strategy.Wait;\nimport org.testcontainers.junit.jupiter.Container;\nimport org.testcontainers.junit.jupiter.Testcontainers;\n\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.Statement;\n\n@Testcontainers\npublic class SqlScriptTest {\n\n @Container\n private static final PostgreSQLContainer\u003C?\u003E postgres = new PostgreSQLContainer\u003C"postgres:latest"\u003E()\n .withDatabaseName("test")\n .withUsername("user")\n .withPassword("password")\n .waitingFor(Wait.forListeningPort());\n\n @Test\n void executeSqlScript() throws Exception {\n JdbcDatabaseContainer container = (JdbcDatabaseContainer) postgres;\n\n // \u83b7\u5f97\u003Ccode\u003EJDBC\u003C/code\u003E\u8fde\u63a5\n String jdbcUrl = container.getJdbcUrl();\n String username = container.getUsername();\n String password = container.getPassword();\n Connection connection = DriverManager.getConnection(jdbcUrl, username, password);\n\n // \u6267\u884c\u003Ccode\u003ESQL\u003C/code\u003E\u89e3\u6790\n Statement statement = connection.createStatement();\n statement.execute("CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(255))");\n statement.close();\n\n // \u5173\u95ed\u8fde\u63a5\n connection.close();\n }\n}\n\u003C/code\u003E\n\n2. \u4f7f\u7528\u003Ccode\u003ETestcontainers\u003C/code\u003E\u7684\u003Ccode\u003EGenericContainer\u003C/code\u003E\uff0c\u5728\u542f\u52a8\u7684\u52a8\u6001\u5bb9\u5668\u4e2d\u8fd0\u884c\u4efb\u610f\u547d\u4ee4\u3002\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u7684\u4ee3\u7801\u5728\u6d4b\u8bd5\u4e2d\u6267\u884c\u003Ccode\u003ESQL\u003C/code\u003E\u89e3\u6790\uff1a\n\n\u003Ccode\u003Ejava\nimport org.junit.jupiter.api.Test;\nimport org.testcontainers.containers.GenericContainer;\nimport org.testcontainers.containers.wait.strategy.Wait;\nimport org.testcontainers.junit.jupiter.Container;\nimport org.testcontainers.junit.jupiter.Testcontainers;\n\n@Testcontainers\npublic class SqlScriptTest {\n\n @Container\n private static final GenericContainer\u003C?\u003E container = new GenericContainer\u003C"postgres:latest"\u003E()\n .withExposedPorts(5432)\n .waitingFor(Wait.forListeningPort());\n\n @Test\n void executeSqlScript() throws Exception {\n // \u83b7\u5f97\u52a8\u6001\u5bb9\u5668\u7684\u003Ccode\u003EIP\u003C/code\u003E\u548c\u7aef\u53e3\n String host = container.getContainerIpAddress();\n int port = container.getMappedPort(5432);\n\n // \u6267\u884c\u003Ccode\u003ESQL\u003C/code\u003E\u89e3\u6790\n ProcessBuilder processBuilder = new ProcessBuilder(\n "psql",\n "-h", host,\n "-p", String.valueOf(port),\n "-U", "postgres",\n "-d", "test",\n "-a", "\u2013q", "\u2013f", "path/to/sql/script.sql"\n );\n Process process = processBuilder.start();\n int exitCode = process.waitFor();\n if (exitCode != 0) {\n throw new RuntimeException("Failed to execute SQL script");\n }\n }\n}\n\u003C/code\u003E\n\n\u5728\u4ee5\u4e0a\u793a\u4f8b\u4e2d\uff0c\u9700\u8981\u5c06\u003Ccode\u003Epath/to/sql/script.sql\u003C/code\u003E\u66ff\u6362\u4e3a\u003Ccode\u003ESQL\u003C/code\u003E\u89e3\u6790\u7684\u5b9e\u9645\u8def\u5f84\u3002
原文地址: http://www.cveoy.top/t/topic/pIXP 著作权归作者所有。请勿转载和采集!