我有一个java应用程序,它使用Liquibase进行迁移,到目前为止一直在使用MySQL来运行测试用例。
我想使用 h2 数据库运行测试用例。为此,我对 JDBC 配置进行了必要的更改。但是当我运行
mvn test
时,出现以下错误:
索引“idx_workflow_id”已存在; SQL语句:
在调试时,我发现两个表具有相同名称的索引:
idx_workflow_id
,并且 h2 数据库具有数据库中具有唯一索引名称的一些限制。
现在的问题是数据库结构已经存在于 staging 和 prod 中,并且无法更改索引名称。
有什么方法可以运行 h2 数据库的迁移,而不创建索引或忽略它们。或者进行一些配置更改,这将允许数据库中具有相同名称的索引。
配置:
database:
driverClass: org.h2.Driver
url: "jdbc:h2:mem:my_db;MODE=MySQL;DATABASE_TO_UPPER=false;IGNORECASE=TRUE;DB_CLOSE_DELAY=-1"
maxWaitForConnection: 1s
minSize: ${MIN_DB_CONNECTIONS:-10}
maxSize: ${MAX_DB_CONNECTIONS:-100}
defaultTransactionIsolation: READ_COMMITTED
checkConnectionWhileIdle: false
checkConnectionOnBorrow: true
checkConnectionOnConnect: true
validationQuery: "SELECT 1"
properties:
hibernate.dialect: org.hibernate.dialect.H2Dialect
hibernate.show_sql: false
hibernate.hbm2ddl.auto: none
hibernate.session.events.log: false
hibernate.generate_statistics: true
org.hibernate.stat: INFO
charSet: UTF-8
我遇到了同样的问题,我发现了这个问题,所以我可以分享我的解决方法。
我发现的唯一方法是忽略在 h2 上下文中使用
dbms="!h2"
创建索引的更改集
<changeSet id="index-creation" author="ffex" dbms="!h2">
<createIndex ... />
</changeSet>
现在你有两个选择:
<changeSet id="index-creation-test" author="ffex" dbms="h2">
<createIndex ... />
</changeSet>
<changeSet id="index-drop" author="ffex" dbms="!h2">
<dropIndex ... />
</changeSet>
<changeSet id="index-creation-new" author="ffex">
<createIndex ... />
</changeSet>
您还可以使用属性
contextFilter
来控制上下文中变更集的执行。