transaction - Ejecución de liquibase dentro del código de Java
liquibase sql transaction (2)
Por alguna razón, no hay documentación sobre la ejecución de liquibase dentro del código Java. Quiero generar tablas para pruebas unitarias.
¿Cómo lo ejecutaría directamente en Java?
p.ej
Liquibase liquibase = new Liquibase()
liquibase.runUpdates() ?
Debe ser algo como (tomado de la fuente 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
}
}
}
Hay varias implementaciones de ResourceAccessor dependiendo de cómo se deben encontrar los archivos de registro de cambios.
Encontré una forma de lograr la configuración de la base de datos utilizando Maven o Java. El ejemplo anterior utiliza FileSystemResourceAccessor()
, que desafortunadamente lo hace de manera que si implementa una aplicación que necesita configurar una base de datos desde el propio jar, entonces tendrá que extraer el jar como código postal para solucionarlo, ya que estos Los archivos solo existen en el jar. Esto significa que, en última instancia, su jarra no es portátil, y debe tener un maven
donde quiera que quiera configurar la base de datos.
Usa esta estructura:
src/main/resources/liquibase/db.changelog-master.xml
src/main/resources/liquibase/changelogs/...
Tu maestro de cambios de base de datos puede verse así:
<?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>
Puede usar esta sección para su pom.xml, para asegurarse de que mvn install
también configurará su base de datos liquibase.
<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>
Use ClassLoaderResourceAccessor()
lugar de 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
}
}
}
}