由于某种原因,没有关于在 Java 代码中运行 liquibase 的文档。我想为单元测试生成表格。
我如何直接在 Java 中运行它?
例如
Liquibase liquibase = new Liquibase()
liquibase.runUpdates() ?
原文由 sproketboy 发布,翻译遵循 CC BY-SA 4.0 许可协议
由于某种原因,没有关于在 Java 代码中运行 liquibase 的文档。我想为单元测试生成表格。
我如何直接在 Java 中运行它?
例如
Liquibase liquibase = new Liquibase()
liquibase.runUpdates() ?
原文由 sproketboy 发布,翻译遵循 CC BY-SA 4.0 许可协议
我找到了一种 使用 maven 或 Java 来实现设置数据库的方法。上面的示例使用 FileSystemResourceAccessor()
,不幸的是,如果您部署需要从 jar 本身设置数据库的应用程序,那么您最终不得不将 jar 解压 为 zip 作为解决方法,因为这些 liquibase 文件只存在于 jar 中。这意味着你的 jar 最终是不可移植的,你必须有 maven
无论你想设置数据库。
使用这个结构:
src/main/resources/liquibase/db.changelog-master.xml
src/main/resources/liquibase/changelogs/...
您的数据库变更日志主机可能如下所示:
<?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 数据库。
<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
}
}
}
}
原文由 thouliha 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.2k 阅读
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
它应该是这样的(取自 liquibase.integration.spring.SpringLiquibase 来源):
ResourceAccessor 有多种实现,具体取决于应如何找到更改日志文件。