我的@SpringBootTest
被@Sql({"classpath:create_tables_views.sql"})
注释
,create_tables_views.sql
内第一行为
DROP VIEW IF EXISTS my_schema.my_view;
当我尝试运行我的@SpringBootTest
时,我得到以下异常:
Caught exception while invoking 'beforeTestMethod' callback on TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@1e0f9063] for test method [void ...] and test instance [...]
org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of class path resource [create_tables_views.sql]: DROP VIEW IF EXISTS my_schema.my_view; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "MY_SCHEMA" not found;
我错过了什么?
更新1:
在这里添加更多细节以增加清晰度:这就是我的类的注释方式
@ActiveProfiles("test") // (application-test.yml is currently empty)
@AutoConfigureTestDatabase // (so yes, it's spinning up a brand new H2 instance each time)
@AutoConfigureWebTestClient
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Sql({"classpath:create_tables_views.sql"})
同样,在引导时,我在日志消息中看到:
16:12:08.489 INFO [main] o.s.j.d.e.EmbeddedDatabaseFactory: Starting embedded database: url='jdbc:h2:mem:9af3a13a-91b3-47ff-a85d-8488d2329a53;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
因为初始SQL命令是DROP VIEW
IF EXISTSmy_schema.my_view;
,我不明白为什么它抛出一个异常,如果模式不存在
更新2:
在我的src/main/java
文件夹中,我有2个单独的@Configuration
文件,其中包含@Bean
定义,为2个不同的数据库提供DataSource
,LocalContainerEntityManagerFactoryBean
和PlatformTransactionManager
,一个@Primary
一个用于Postgres/Postgis,另一个用于Oracle。
数据库无法判断my_view
视图是否存在于模式my_schema
中,因为这个模式不存在.
命令DROP VIEW IF EXISTS
首先为方案my_schema
检索元数据,检查给定的视图是否存在,如果存在,则删除它。在您的示例中,它失败是因为该命令无法从模式my_schema
检索元数据,因为该模式不存在。
可能是您期望的那样:"检查模式my_schema
是否存在。如果它不存在,不要再做任何事情。如果模式存在,检查视图是否存在。只有当视图存在时,才发出命令来删除它。"但事实并非如此。如果模式不存在,则抛出错误。