【发布时间】:2020-12-03 15:16:55
【问题描述】:
我在我的网络应用程序中使用spring-boot-starter-data-jdbc 依赖项。 Spring Boot 可以在应用程序启动时自动创建模式并从根类路径位置 schema.sql 和 data.sql 对其进行初始化,但我很好奇是否有任何方法可以在应用程序之后使用相同的 sql-scripts 重新初始化数据库已经开始了吗?
我在演示模式下需要此功能,以便用户在玩了足够多的表格后可以将数据库重置为初始状态。这就是我希望我的重置控制器的样子:
@Controller
@RequestMapping("/reset")
@Profile("demo")
public class ResetController {
@GetMapping
public String resetTables(HttpSession session) {
// some code re-initializing the database
// form schema.sql and data.sql goes here
session.invalidate();
return "redirect:/home";
}
}
我知道,我总是可以使用JdbcTemplate 及其方法手动删除、创建和重新填充每个表,遵循schema.sql 和data.sql 中定义的sql 语句的逻辑,但这会有点乏味。也许,Spring 有一些开箱即用的方法来针对数据库执行这些脚本,这将有助于重新加载带有初始演示数据的表?
更新:
这是基于Flyway 迁移的可能解决方案之一,正如 Charles B 在接受的答案中所建议的那样:
- 将
flyway-core依赖添加到项目中。 - 按照 Flyway 命名要求将
schema.sql和data.sql重命名为V1__schema.sql和V2__data.sql,并将它们放在/resources/db/migration目录下。 - 将
spring.flyway.baseline-on-migrate属性设置为true。 - 然后,可以重写上面描述的复位控制器,就像这样简单:
@Controller
@RequestMapping("/reset")
@Profile("demo")
public class ResetController {
private final Flyway flyway;
public ResetController(Flyway flyway) {
this.flyway = flyway;
}
@GetMapping
public String resetTables(HttpSession session) {
flyway.clean();
flyway.migrate();
session.invalidate();
return "redirect:/home";
}
}
此外,对于不同的迁移场景,可以设置 spring.flyway.locations 属性引用不同的 SQL 文件 - 分别为每个配置文件,甚至通过将 spring.flyway.enabled 属性设置为 false 来禁用某些配置文件的 Flyway 迁移。
【问题讨论】:
标签: java spring spring-boot spring-jdbc