如何通过Maven命令在Spring Boot应用外部执行指定SQL文件
实现方案
以下三种方案均可满足需求,你可以根据你的使用场景选择:
方案1:Spring Boot应用内自定义触发逻辑(推荐,复用现有配置)
- 首先将需要执行的SQL文件放到
src/main/resources/sql/目录下,比如命名为insert_config_records.sql - 新增一个触发执行的组件类,仅当指定启动参数存在时才执行SQL,执行完成后自动退出:
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.core.io.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.datasource.init.ScriptUtils; import org.springframework.stereotype.Component; import javax.sql.DataSource; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.sql.Connection; @Component @ConditionalOnProperty(name = "run.custom-config-sql", havingValue = "true") public class CustomConfigSqlRunner implements CommandLineRunner { @Autowired private DataSource dataSource; @Value("classpath:sql/insert_config_records.sql") private Resource sqlResource; @Override public void run(String... args) throws Exception { try (Connection conn = dataSource.getConnection(); InputStreamReader reader = new InputStreamReader(sqlResource.getInputStream(), StandardCharsets.UTF_8)) { ScriptUtils.executeSqlScript(conn, new org.springframework.core.io.support.EncodedResource(sqlResource, StandardCharsets.UTF_8)); System.out.println("配置SQL文件执行完成,程序即将退出"); System.exit(0); } } }
- 执行命令:
本地开发时用Maven直接执行:mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Drun.custom-config-sql=true"
打包后部署环境执行:java -jar 你的应用包名.jar -Drun.custom-config-sql=true
优势:复用应用现有的数据库连接配置,无需额外维护账号密码,执行完直接退出不会启动完整web服务
方案2:用Flyway命令行工具独立执行
- 下载和你应用内使用版本一致的Flyway命令行工具,避免兼容性问题
- 在SQL文件所在目录下新建
flyway.conf配置文件,填入数据库连接信息:
flyway.url=jdbc:postgresql://数据库地址:5432/数据库名 flyway.user=数据库用户名 flyway.password=数据库密码 flyway.locations=filesystem:./
- 将你的SQL文件命名为
R__insert_latest_configs.sql(使用R前缀表示可重复执行,后续修改SQL后仍可重复执行) - 执行命令:
flyway migrate
优势:无需启动Spring Boot应用,直接操作数据库,适合生产环境紧急插入配置的场景
方案3:用PostgreSQL原生psql命令执行(最轻量化)
- 只要本地安装了PostgreSQL的psql客户端,直接执行以下命令即可:
psql -h 数据库地址 -p 5432 -U 用户名 -d 数据库名 -f 你的SQL文件绝对路径 - 执行后输入数据库密码即可完成SQL执行
优势:不依赖Java、Maven、Flyway任何工具链,执行速度最快
注意事项
- 如果需要重复执行SQL,建议在INSERT语句中添加
ON CONFLICT (唯一键) DO NOTHING逻辑,避免约束冲突报错 - 生产环境执行前务必先在测试环境验证SQL正确性,避免误改数据
- 不要将临时执行的SQL文件放到Flyway默认的
db/migration目录下,避免应用启动时自动执行该SQL
内容的提问来源于stack exchange,提问作者Meysam Zarei
相关产品推荐
相关产品推荐

