当前位置: 首页 > 知识库问答 >
问题:

执行update命令时,Liquibase更改集显示为空

牟嘉
2023-03-14

在我解释我的问题之前,我必须声明我是LiquiBase的新手。

我正在尝试在我的测试类中运行liquibase更新方法。我的代码读取变更集文件,获取锁,从changelog读取并释放锁,但不执行变更集本身。下面是我的结构:

public class LiquibaseTestDbUtil {

    private static final String LIQUIBASE_CHANGELOG_FILE = "liquibase/liquibase-changelog-test.xml";
    private static final String UNIT_NAME = "com.ihsinformatics.tbreach.api.test";
    // Get entity manager
    EntityManager entityManager = Persistence.createEntityManagerFactory(
            UNIT_NAME).createEntityManager();

    @Before
    public void setupDatabase() throws Exception {
        Connection connection = ((SessionFactoryImpl) entityManager.unwrap(
                Session.class).getSessionFactory()).getConnectionProvider()
                .getConnection();
        Database database = DatabaseFactory.getInstance()
                .findCorrectDatabaseImplementation(
                        new JdbcConnection(connection));
        // Get liquibase instance / execute update / drop
        URL file = ClassLoaderUtil.getResource(LIQUIBASE_CHANGELOG_FILE,
                LiquibaseTestDbUtil.class);
        DatabaseChangeLog dbChangeLog = new DatabaseChangeLog(file.getPath());
        Liquibase liquibase = new Liquibase(dbChangeLog,
                new ClassLoaderResourceAccessor(), database);
        liquibase.update(new Contexts("test"));
        // liquibase.dropAll();
    }

    @Test
    public void someTestCase() throws Exception {
    }
}
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <property name="schemaName" value="tbreach_api_test" dbms="mysql,oracle,postgresql" />

    <changeSet author="owais.hussain" context="test" id="20180216-1" runOnChange="true">
        <createTable tableName="data_log" schemaName="${schemaName}">
            <column autoIncrement="true" name="log_id" type="INT">
                <constraints primaryKey="true" />
            </column>
            <column name="log_type" type="CHAR(6)">
                <constraints nullable="false" />
            </column>
            <column name="entity_name" type="VARCHAR(45)">
                <constraints nullable="false" />
            </column>
            <column name="record" type="TEXT" />
            <column name="description" type="TEXT" />
            <column name="date_created" type="datetime(6)">
                <constraints nullable="false" />
            </column>
            <column name="created_by" type="INT" />
            <column name="created_at" type="INT" />
            <column name="uuid" type="CHAR(38)">
                <constraints nullable="false" unique="true" />
            </column>
        </createTable>
    </changeSet>

    <!-- Test Data -->
    <changeSet author="owais.hussain" id="2018-02-19" runOnChange="true">
        <sqlFile dbms="mysql" path="src/test/resources/test-data.sql" />
    </changeSet>

</databaseChangeLog>
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="com.ihsinformatics.tbreach.api.test" transaction-type="RESOURCE_LOCAL">
        <description>
            Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
        </description>
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/tbreach_api_test" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="mypassword" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
        </properties>

    </persistence-unit>

</persistence>

在我的pom.xml中有以下依赖项

  • JUnit 4.10
  • 液体碱-核心3.5.4
  • MySQL-Connector-Java 5.1.45
  • 其他依赖项,如log4j

当我在Eclipse中以Junit的形式执行LiquibaseTestDbUtil时,我会得到以下日志:

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
INFO 2/19/18 2:40 PM: liquibase: Successfully acquired change log lock
INFO 2/19/18 2:40 PM: liquibase: Reading from tbreach_api_test.DATABASECHANGELOG
INFO 2/19/18 2:40 PM: liquibase: Successfully released change log lock
  • 注意,我已经注释掉了liquiBase.dropall()方法,所以数据库更改应该会持续(正如我所知)。

共有1个答案

太叔马鲁
2023-03-14

尝试使用替代liquibase构造函数

Liquibase liquibase = new Liquibase(
    "your file path", 
    new FileSystemResourceAccessor(), 
    database
);
 类似资料:
  • 我试图从现有数据库(MySQL)中使用liquibase(3.5.5)。 > C: /液化酶-3.5.5/liquibase。bat—驱动程序=com。mysql。jdbc。驱动程序^--classpath=C:/Libraries/mysql-connector-java-5.1.37-bin。jar^--changeLogFile=db。变更日志。xml^--url=“jdbc:mysql:/

  • 在Liquibase论坛的一次讨论中,开发人员Nathan Voxland说Liquibase应该在每个变更集之后提交。我知道这是一个七年前的线程,所以从那以后可能发生了很多变化,但也许没有? 它应该在变更集之后提交。在大多数数据库上,addColumn也会自动提交。 changeSet标记的文档可以解释为“在changelog中的所有前提条件成功之后提交”,这与7年前的帖子相矛盾。 我有一个ma

  • 我们在webapp中使用liquibase 3.0.8已经有一段时间了,数据库更新是由Spring-liquibase bean在应用程序启动时应用的。我们决定从3.1、3.1.1、3.2.0到3.2.3,逐步更新我们的开发数据库,此时更新失败,出现校验和验证错误。我们尝试恢复到3.2.0,但得到了一组不同的校验和错误。我还尝试从3.0.8直接转到3.4.1(编写时的当前版本),并得到相同的校验和

  • 假设我有一个包含3个变更集的changeLog文件。如果我从命令行运行Liquibase Update命令,但它在第二个变更集上失败,那么Liquibase会回滚到Update命令开始执行之前吗?还是保留变更集1中的变更?

  • 问题内容: 我已经给出了如下所示的命令行, 命令: 错误显示 sed:-e表达式#1,char 22:命令后的多余字符 同时将“ s”选项设置为 错误显示为 sed:-e表达式#1,字符32:`s’的未知选项 问题答案: 似乎某些变量正在扩展为包含的值。使用不包含在任何变量中的其他定界符,例如 (您的第一个命令不是有效的表达式。)

  • 我有一个由mysql数据库支持的dropwizard应用程序。我正在使用liquibase包装器进行数据库迁移 首先,我使用“db dump”命令自动生成迁移。xml文件。 现在我正在重构数据库,我希望能够更新特定的列名和表的名称。 我使用先决条件跳过已经生成的表以跳过“”命令 现在如何跳过主键和外键约束的执行?在变更日志级别是否有一个先决条件可以用来表示“跳过已执行的变更集”?或者我只是创建一个