在Java代码中运行liquibase
由于某种原因,没有关于在Java代码中运行liquibase的文档。 我想为unit testing生成表。
我将如何直接在Java中运行它?
例如
Liquibase liquibase = new Liquibase() liquibase.runUpdates() ?
它应该是类似的(取自liquibase.integration.spring.SpringLiquibase源码):
java.sql.Connection c = YOUR_CONNECTION; Liquibase liquibase = null; try { Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(c)) liquibase = new Liquibase(YOUR_CHANGELOG, new FileSystemResourceAccessor(), database); liquibase.update(); } catch (SQLException e) { throw new DatabaseException(e); } finally { if (c != null) { try { c.rollback(); c.close(); } catch (SQLException e) { //nothing to do } } }
ResourceAccessor有多种实现方式,具体取决于您应该如何找到更改日志文件。
我找到了一种使用maven或Java实现数据库设置的方法。 上面的例子使用了FileSystemResourceAccessor()
,遗憾的是,如果你部署了一个需要从jar本身设置数据库的应用程序,那么你最终必须将jar解压缩为zip作为解决方法,因为这些liquibase文件只存在于jar中。 这意味着您的jar最终不可移植,并且您必须拥有maven
无论您想要设置数据库。
使用此结构:
src/main/resources/liquibase/db.changelog-master.xml
src/main/resources/liquibase/changelogs/...
您的DB changelog主机可能如下所示:
您可以将此部分用于pom.xml,以确保mvn install
还将设置您的liquibase DB。
org.liquibase liquibase-maven-plugin 3.5.1 liquibase/db.changelog-master.xml org.postgresql.Driver ${jdbc.url} ${jdbc.username} ${jdbc.password} process-resources update
使用ClassLoaderResourceAccessor()
而不是FileSystemResourceAccessor()
。
public static void runLiquibase() { Liquibase liquibase = null; Connection c = null; try { c = DriverManager.getConnection(DataSources.PROPERTIES.getProperty("jdbc.url"), DataSources.PROPERTIES.getProperty("jdbc.username"), DataSources.PROPERTIES.getProperty("jdbc.password")); Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(c)); log.info(DataSources.CHANGELOG_MASTER); liquibase = new Liquibase(DataSources.CHANGELOG_MASTER, new ClassLoaderResourceAccessor(), database); liquibase.update("main"); } catch (SQLException | LiquibaseException e) { e.printStackTrace(); throw new NoSuchElementException(e.getMessage()); } finally { if (c != null) { try { c.rollback(); c.close(); } catch (SQLException e) { //nothing to do } } } }