代码之家  ›  专栏  ›  技术社区  ›  Aligator

在Spring Boot中创建数据库表后运行自定义脚本

  •  2
  • Aligator  · 技术社区  · 7 年前

    我在项目中使用Spring Boot with gradle,项目结构如下:

    src/
    ├── main
    │   ├── java
    │   └── resources
    │       └── import.sql
    ├── scripts
    │   └── custom_script.sql
    └── test
        ├── java
        │   ├── persistent
        │   │   └── UserRepositoryTest.java
        │   └── TestConfiguration.java
        └── resources
            └── import.sql
    

    在里面 custom_script.sql 我的应用程序需要一些sql脚本,例如插入之前的触发器等等。是否可以配置应用程序,例如使用应用程序属性文件、hibernate或其他方式来加载该脚本并在创建表后创建触发器?

    我定义为JPA实体的表。因此,我预期的步骤顺序是:

    1. 从JPA实体创建表
    2. 从脚本/自定义脚本加载触发器。sql
    3. 从加载插入脚本 resources/import.sql
    4. 运行应用程序/测试(取决于我是否决定运行主应用程序或测试)

    出于测试目的,我尝试创建 TestConfiguration.java 我使用的界面 @Sql 像这样的演讲:

    @Sql("src/scripts/custom_script.sql")
    public interface TestConfiguration {
    }
    

    接下来,我想将此接口用于需要这样的脚本的测试:

    @Transactional
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class UserRepositoryTest implements TestConfiguration {
    
    }
    

    问题是:

    1. 我的解决方案不起作用
    2. 它是只覆盖测试用例,而不是应用程序正常启动时的用例

    你能帮我一下吗?谢谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   Bohuslav Burghardt    6 年前

    @Sql 仅适用于测试:

    https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/jdbc/Sql.html

    但是,您可以尝试以下方法。 通过将脚本文件夹放在src/test/resources下,将脚本添加到类路径中

    然后设置 @Sql UserRepositoryTest类上的注释,并将路径更改为:

    @Sql("classpath:scripts/custom_script.sql")

    如果您想在其他测试中使用它,请创建一个带有所需注释的抽象测试类。

    如果需要真正的数据库迁移,请查看Flyway: https://flywaydb.org/

        2
  •  0
  •   locus2k    7 年前

    查看Flyway https://flywaydb.org/ . 该插件允许在启动期间进行数据库迁移,并可以对数据库执行各种操作以从一个版本迁移到另一个版本。这将满足您的需要。