在我解释我的问题之前,我必须声明我是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中有以下依赖项
当我在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构造函数
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文件。 现在我正在重构数据库,我希望能够更新特定的列名和表的名称。 我使用先决条件跳过已经生成的表以跳过“”命令 现在如何跳过主键和外键约束的执行?在变更日志级别是否有一个先决条件可以用来表示“跳过已执行的变更集”?或者我只是创建一个