web-dev-qa-db-fra.com

Exécution de liquibase dans du code Java

Pour une raison quelconque, il n'y a pas de documentation sur l'exécution de liquibase dans le code Java. Je veux générer des tables pour les tests unitaires.

Comment pourrais-je l'exécuter directement en Java?

par exemple.

Liquibase liquibase = new Liquibase()
liquibase.runUpdates() ?
27
sproketboy

Cela devrait ressembler à quelque chose comme ça (tiré de la source 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
        }
    }
}

Il existe plusieurs implémentations de ResourceAccessor en fonction de la manière dont vos fichiers de journal des modifications doivent être trouvés.

35
Nathan Voxland

J'ai trouvé un moyen de configurer la base de données en utilisant soit maven ou Java. L'exemple ci-dessus utilise FileSystemResourceAccessor(), ce qui fait malheureusement en sorte que si vous déployez une application devant configurer une base de données à partir du fichier jar lui-même, vous devez alors extraire le fichier jar sous forme de solution de contournement. , puisque ces fichiers liquibase n’existent que dans le pot. Cela signifie que votre fichier jar n'est finalement pas portable et que vous devez disposer de maven où vous voulez configurer la base de données.

Utilisez cette structure:

src/main/resources/liquibase/db.changelog-master.xmlsrc/main/resources/liquibase/changelogs/...

Votre maître de journal des modifications de base de données peut ressembler à ceci:

<?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>

Vous pouvez utiliser cette section pour votre pom.xml, afin de vous assurer que mvn install configurera également votre base de données 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>

Utilisez ClassLoaderResourceAccessor() au lieu 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
            }
        }
    }
}
1
thouliha