在生产中我使用的是Oracle,所有的更改日志都是用Oracle编写的。 在我的开发环境中,我正在尝试在Oracle兼容模式下在H2实例上生成更改日志。 这是为了提高集成测试速度。
我的问题是Liquibase正在验证我对H2的更改日志,而不是Oracle。 有没有办法迫使Liquibase对Oracle进行验证,即使我的db url看起来像是H2?
我最头疼的是关于序列和dropNotNullConstraint验证。
Liquibase版本: 2.0.5(我也试过3.1.1,同样的问题)
H2连接url: jdbc:h2:tcp:// localhost:9092 / test; MODE = Oracle; AUTO_SERVER = TRUE; DB_CLOSE_DELAY = -1
我很确定这是一种常见情况,所以我猜我可能做错了什么?
任何帮助将不胜感激
答案 0 :(得分:2)
由于Liquibase是用Java实现的并且依赖于JDBC,我将使用Java来解释。
Liquibase有一个已实现的数据库列表。这取决于你如何从Java代码中调用它,但是假设您使用liquibase.database.DatabaseFactory
,扩展它或实现类似的东西。通常你的代码看起来像这样(Scala中的例子):
def createLiquibase(dbConnection: Connection, diffFilePath: String): Liquibase = {
val database = DatabaseFactory.getInstance.findCorrectDatabaseImplementation(new JdbcConnection(dbConnection))
val classLoader = classOf[SchemaMigration].getClassLoader
val resourceAccessor = new ClassLoaderResourceAccessor(classLoader)
new Liquibase(diffFilePath, resourceAccessor, database)
}
def updateDb(db: DbConnectionProvider, diffFilePath: String): Unit = {
val dbConnection = db.getConnection
val liquibase = createLiquibase(dbConnection, diffFilePath)
try {
liquibase.update(null)
} catch {
case e: Throwable => throw e
} finally {
liquibase.forceReleaseLocks()
dbConnection.rollback()
dbConnection.close()
}
}
请注意此部分DatabaseFactory.getInstance.findCorrectDatabaseImplementation(new JdbcConnection(dbConnection))
我们传入java.sql.Connection
,Liquibase会为其找到适当的Database
实现。您可以覆盖findCorrectDatabaseImplementation
,甚至可以创建自己的Database
子类。无论你喜欢什么。
DatabaseFactory
中的方法是public Database findCorrectDatabaseImplementation(DatabaseConnection connection) throws DatabaseException
。从那里,您可以了解有关Database
类型的更多信息。您可以从H2或Oracle继承它并覆盖某些部分。
如果您使用Liquibase cmd客户端,您可以执行我上面描述的操作,构建一个jar文件等,然后从命令行运行,确保您的新类在类路径上。
H2中的兼容模式并不能保证完全支持Oracle,Postgres等,因此在它上面测试Oracle DML有点可疑。它可能会工作,直到你找不到它为止。