何らかの理由で、Javaコード内でliquibaseを実行することに関するドキュメントはありません。ユニットテスト用のテーブルを生成したいのですが。
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自体からデータベースをセットアップする必要があるアプリケーションをデプロイした場合、extractこれらのliquibaseファイルはjarにのみ存在するため、回避策としてのzipとしてのjar。つまり、jarは最終的には移植できなくなり、データベースをセットアップする場所にはmaven
が必要になります。
次の構造を使用します。
_src/main/resources/liquibase/db.changelog-master.xml
_ _src/main/resources/liquibase/changelogs/...
_
DB変更ログマスターは次のようになります。
_<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<!-- <includeAll path="src/main/resources/liquibase/changelogs"/> -->
<include file="changelogs/my-date.1.sql" relativeToChangelogFile="true"/>
</databaseChangeLog>
_
このセクションをpom.xmlに使用して、_mvn install
_がliquibase DBもセットアップすることを確認できます。
_<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<changeLogFile>liquibase/db.changelog-master.xml</changeLogFile>
<driver>org.postgresql.Driver</driver>
<url>${jdbc.url}</url>
<username>${jdbc.username}</username>
<password>${jdbc.password}</password>
</configuration>
<executions>
<execution>
<phase>process-resources</phase>
<goals>
<goal>update</goal>
</goals>
</execution>
</executions>
</plugin>
_
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
}
}
}
}
_