我在项目中使用spring boot。我有liquibase脚本来创建表并输入种子数据。 repo测试使用@DataJpaTest注释运行,该注释默认使用内存中的h2数据库。
此项目的db最初是SQLServer,因此liquibase脚本在PascalCase中具有表名,例如FooBar的。之后db必须更改为PostgreSQL,因此添加了新的liquibase脚本以重命名为从PascalCase到snake_case的表格,例如从FooBar到foo_bar。
liquibase脚本针对PostgreSQL数据库成功运行,但当它们作为repo测试的一部分运行时(针对H2 db),重命名脚本失败。尝试使用单个词重命名表名时,它们会失败,例如从卖淫到机构。我收到以下错误:
Caused by: org.h2.jdbc.JdbcSQLException: Table "INSTITUTION" already exists; SQL statement:
ALTER TABLE PUBLIC.Institution RENAME TO institution [42101-196]
我已尝试并失败的解决方案:
src / test / resources中一个单独的application.properties文件,指向自定义内存中的h2数据库,如下所示:
spring.datasource.url = jdbc:h2:mem:test; DB_CLOSE_ON_EXIT = FALSE; MODE = PostgreSQL spring.datasource.username = sa spring.datasource.password = sa spring.datasource.driverClassName = org.h2.Driver
我还试图在liquibase脚本中用双引号提及表名,认为它会保留这种情况。没用?
请帮忙! :(
答案 0 :(得分:1)
H2将您的不带引号的表名引用转换为大写。如果您使用双引号引用目标名称:
onResponderMove
...会将PanResponder
表重命名为PanResponder
。
您的JPA实现可能必须配置为引用此处的表名。使用hibernate,您可以使用panResponder.panHandlers
。