Spring Boot中Flyway执行PostgreSQL COPY命令加载CSV报错求助
解决Flyway执行PostgreSQL COPY命令加载CSV文件的问题
问题根源
PostgreSQL的COPY FROM命令是让数据库服务器进程读取文件,你指定的./scripts/test.csv路径是相对于数据库服务器的文件系统,而非你的Spring Boot项目资源路径,因此服务器无法找到目标文件。Flyway作为客户端执行SQL,无法直接让服务器访问应用内的资源文件。
可行解决方案
方案一:使用Flyway Java迁移脚本(推荐)
用Java迁移代替SQL脚本,直接从Spring Boot资源中读取CSV,通过PostgreSQL的CopyManager执行客户端侧的COPY操作,无需依赖数据库服务器的文件系统。
- 在
src/main/resources/db/migration目录下创建Java迁移类(命名规则与SQL脚本一致):
import org.flywaydb.core.api.migration.BaseJavaMigration; import org.flywaydb.core.api.migration.Context; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; import java.io.InputStream; import java.sql.Connection; public class V1_0_83__TestDataMigration extends BaseJavaMigration { @Override public void migrate(Context context) throws Exception { // 获取数据库连接并转为PostgreSQL原生连接 Connection connection = context.getConnection(); BaseConnection pgConnection = connection.unwrap(BaseConnection.class); CopyManager copyManager = new CopyManager(pgConnection); // 读取项目资源中的CSV文件 InputStream csvStream = getClass().getResourceAsStream("/db/migration/scripts/test.csv"); if (csvStream == null) { throw new RuntimeException("未找到CSV资源文件: /db/migration/scripts/test.csv"); } // 执行COPY命令,用STDIN指定从输入流读取数据 String copySql = "COPY public.table1(type, code, prefix) FROM STDIN DELIMITER ',' CSV HEADER"; copyManager.copyIn(copySql, csvStream); csvStream.close(); } }
- 删除原来的
V1.0.83__test.sql脚本,Flyway会自动执行这个Java迁移类。
方案二:将CSV放到数据库服务器可访问的路径(不推荐)
如果坚持用SQL脚本,需要把CSV文件复制到数据库服务器的文件系统中,然后修改COPY命令的路径为服务器上的绝对路径,例如:
COPY public.table1(type, code, prefix) FROM '/var/lib/postgresql/data/scripts/test.csv' DELIMITER ',' CSV HEADER
注意:
- 要确保PostgreSQL进程拥有该文件的读取权限
- 不同环境(开发、测试、生产)的路径可能不同,维护成本高,不适合Spring Boot的跨环境部署场景
方案三:使用psql的\copy命令(不推荐)
Flyway原生不支持psql的元命令\copy,但可以通过调用系统命令执行psql脚本。比如在Java代码中调用:
Process process = Runtime.getRuntime().exec("psql -h <host> -U <user> -d <db> -f /path/to/your/script.sql"); process.waitFor();
这种方式需要依赖psql客户端,跨平台兼容性差,且不利于集成到Spring Boot的生命周期中,不推荐。
内容的提问来源于stack exchange,提问作者rakeeee
相关产品推荐
相关产品推荐

