kad*_*amb 6 java mysql indexing h2 unique-constraint
我有一个 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
Run Code Online (Sandbox Code Playgroud)
小智 0
我遇到了同样的问题,我发现了这个问题,所以我可以分享我的解决方法。
我发现的唯一方法是忽略在 h2 上下文中创建索引的 che 更改集dbms="!h2"
<changeSet id="index-creation" author="ffex" dbms="!h2">
<createIndex ... />
</changeSet>
Run Code Online (Sandbox Code Playgroud)
现在你有两个选择:
<changeSet id="index-creation-test" author="ffex" dbms="h2">
<createIndex ... />
</changeSet>
Run Code Online (Sandbox Code Playgroud)
<changeSet id="index-drop" author="ffex" dbms="!h2">
<dropIndex ... />
</changeSet>
<changeSet id="index-creation-new" author="ffex">
<createIndex ... />
</changeSet>
Run Code Online (Sandbox Code Playgroud)
您还可以使用该属性contextFilter来控制上下文中变更集的执行。