Liquibase Java,变更集不适用

问题描述 投票:0回答:6

我目前正在为我的实习构建一个项目,两天来我尝试在 java 中使用 Liquibase,但我陷入了困境。一切似乎都正确:找到了变更日志文件,正确的 URI、用户名和密码;但是当我运行它时,我的变更集没有被处理。

我使用此类来管理程序中的 liquibase 操作,例如 rollbackupdateupdateSQLfutureRollbackSQL,给定更改日志和最终目标文件。如果源或目标来自远程服务器,我会使用一些 SSH 交互(scp to、scp from)与 JSch 和临时文件(但这不是主题)。

这是我现在的java代码,假设之前设置了dbuserpasswdrealActionchangelogpathdest是一些数据存储类。

Connection c = null;
Database database = null;
PrintWriter pw = null;
File file = null;
liquibase.Liquibase liquibase = null;
contexts = db+"."+user;
try {
    pw = new PrintWriter(new FileWriter(file));
    // Get connection
    c = SQLManager.getInstance().getConnection(db, user, passwd);
    // Get liquibase connection
    database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(c));
    liquibase = new liquibase.Liquibase(new DatabaseChangeLog(fsource), new FileSystemResourceAccessor(),
            database);
    // Run liquibase action
    switch (realAction) {
        case Constants.LIQUIBASE_ACTION_FUTUREROLLBACKSQL:
            liquibase.futureRollbackSQL(pw);
            break;
        case Constants.LIQUIBASE_ACTION_UPDATESQL:
            liquibase.update(contexts, pw);
            break;
        case Constants.LIQUIBASE_ACTION_UPDATE:
            liquibase.update(contexts);
            if (!c.getAutoCommit())
                c.commit();
            break;
        default:
            throw new OdewipElementRuntimeException(this, "Action not implemented");
    }
    pw.close();
    database.close();
    c.close();
} catch (IOException | SQLException | LiquibaseException e) {
    throw new Exception(e.getMessage());
} finally {
    if (c != null) {
        try {
            c.close();
        } catch (SQLException e) {
            // nothing to do
            throw new RuntimeException(e.getClass() + ": " + e.getMessage());
        }
    }
}

这是我的变更日志:

<?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:ora="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-2.0.xsd    http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">    

    <changeSet id="mychangeset" author="testy">
        <preConditions onSqlOutput="TEST" onFail="MARK_RAN">
            <not>
                <tableExists tableName="abcd"/>
            </not>
        </preConditions>
        <createTable tableName="abcd">
            <column name="id" type="number">
                <constraints primaryKey="true"/>
            </column>
        </createTable>
    </changeSet>

</databaseChangeLog>

Liquibase 似乎做了一些事情,除了解析我的变更集。当我启动操作时,sql 生成的文件仅包含 liquibase 的两个表(databasechangelog 和 databasechangeloglock)的创建,仅此而已。 update 操作根本不会修改任何内容(甚至不会创建前面提到的两个表)。我(100%)确定在执行之前数据库中不存在表abcd

所以我想我现在需要一些帮助,找出不起作用的地方。我尝试查看 liquibase 论坛中的一些示例,但没有任何帮助。 我目前正在使用 Maven 的 liquibase 3.4.0:

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <version>3.4.0</version>
</dependency>

还有我错过的另一个依赖项吗? 另一个小问题是如何包含特殊的 Oracle 数据库驱动程序(ojdbc6.jar)?

谢谢您的回答。

编辑 2015 年 6 月 8 日: 我在调试模式下获取了日志(故意更改了架构名称):

DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOGLOCK
DEBUG 06/08/15 09:28: liquibase: Create Database Lock Table
DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: CREATE TABLE MYSCHEMA.DATABASECHANGELOGLOCK (ID NUMBER(10) NOT NULL, LOCKED NUMBER(1) NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR2(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID))
DEBUG 06/08/15 09:28: liquibase: Created database lock table with name: MYSCHEMA.DATABASECHANGELOGLOCK
DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOGLOCK
DEBUG 06/08/15 09:28: liquibase: Initialize Database Lock Table
DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: DELETE FROM MYSCHEMA.DATABASECHANGELOGLOCK
DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: INSERT INTO MYSCHEMA.DATABASECHANGELOGLOCK (ID, LOCKED) VALUES (1, 0)
DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: SELECT LOCKED FROM MYSCHEMA.DATABASECHANGELOGLOCK WHERE ID=1 FOR UPDATE
DEBUG 06/08/15 09:28: liquibase: Lock Database
DEBUG 06/08/15 09:28: liquibase: Executing UPDATE database command: UPDATE MYSCHEMA.DATABASECHANGELOGLOCK SET LOCKED = 1, LOCKEDBY = 'CRO09177 (xx.xx.xx.xxx)', LOCKGRANTED = to_date('2015-08-06 09:28:28', 'YYYY-MM-DD HH24:MI:SS') WHERE ID = 1 AND LOCKED = 0
INFO 06/08/15 09:28: liquibase: Successfully acquired change log lock
DEBUG 06/08/15 09:28: liquibase: Create Database Change Log Table
INFO 06/08/15 09:28: liquibase: Creating database history table with name: MYSCHEMA.DATABASECHANGELOG
DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: CREATE TABLE MYSCHEMA.DATABASECHANGELOG (ID VARCHAR2(255) NOT NULL, AUTHOR VARCHAR2(255) NOT NULL, FILENAME VARCHAR2(255) NOT NULL, DATEEXECUTED TIMESTAMP NOT NULL, ORDEREXECUTED NUMBER(10) NOT NULL, EXECTYPE VARCHAR2(10) NOT NULL, MD5SUM VARCHAR2(35), DESCRIPTION VARCHAR2(255), COMMENTS VARCHAR2(255), TAG VARCHAR2(255), LIQUIBASE VARCHAR2(20), CONTEXTS VARCHAR2(255), LABELS VARCHAR2(255))
DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOG
INFO 06/08/15 09:28: liquibase: Reading from MYSCHEMA.DATABASECHANGELOG
DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: SELECT FILENAME,AUTHOR,ID,MD5SUM,DATEEXECUTED,ORDEREXECUTED,EXECTYPE,DESCRIPTION,COMMENTS,TAG,LIQUIBASE,LABELS,CONTEXTS FROM MYSCHEMA.DATABASECHANGELOG ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC
DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOGLOCK
DEBUG 06/08/15 09:28: liquibase: Release Database Lock
DEBUG 06/08/15 09:28: liquibase: Executing UPDATE database command: UPDATE MYSCHEMA.DATABASECHANGELOGLOCK SET LOCKED = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1
INFO 06/08/15 09:28: liquibase: Successfully released change log lock
java liquibase
6个回答
2
投票

在 Datical,我们注意到 Liquibase 和 Java 1.8 存在一些问题。您在 Liquibase 用户论坛的帖子中提到您正在使用 Java 1.8,因此 Java 1.8 可能是问题所在。您可以尝试使用 Java 1.7 看看是否会得到不同的结果?如果没有,您可以尝试提高日志记录级别 - 在创建 Liquibase 对象后添加这样的行:

LogFactory.getInstance().getLog().setLogLevel(logLevel);

其中 logLevel 是字符串“debug”



0
投票

我遇到同样的问题,即使问题真的很老,我会尽力给出答案。代码有两点错误:

  • 变更集路径
  • PrintWriter

如果路径不可读,Liquibase API 不会提供良好的反馈,但通常情况下,您会看到没有任何应用查询的日志锁定。

此外,在您的代码中,执行结果会打印在 Writer 中,而不是执行查询。

在这里您可以找到一个有效的示例:

Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(ds.getConnection()));
    
Liquibase liquibase = new Liquibase("./relativepathToChangeset", new FileSystemResourceAccessor(new File("basePathWhereChangeSetIsPresent")), database);
    
liquibase.update("");
    

0
投票

我正在分享我发现的解决方案,用于修复运行时未应用的更改

liquibase update
。请注意,我没有使用 Java,我将更改日志作为
.sql
文件进行管理。我正在使用 Snowflake JDBC 驱动程序。为我解决这个问题的是在
defaultCatalogName
文件中明确定义
defaultSchemaName
liquibase.properties
属性。仅仅在 JDBC url 中提供这些参数是不够的。我的
liquibase.properties
文件看起来像这样:

changeLogFile: sql/changelog.sql
url:  jdbc:snowflake://<url>?db=<database name>&schema=PUBLIC&role=SYSADMIN&warehouse=COMPUTE_WH
driver: net.snowflake.client.jdbc.SnowflakeDriver
username:  <username>
password:  <password>
classpath:  snowflake-jdbc-3.13.14.jar
defaultCatalogName: <database name>
defaultSchemaName: PUBLIC
liquibase.hub.mode=off

我希望这对像我一样看到这篇 StackOverflow 帖子的人有所帮助。


0
投票

我有类似的问题,更改集没有被执行。我将 xsd 版本从 3.1 更改为 3.4 并且它有效。


0
投票

就我而言,我使用的是

SpringLiquibase
,并且需要设置
liquibase.setLabelFilter(schemaName)
,因为我使用的是每个租户的架构。这是 liquibase 缓存更改日志表的结果。

© www.soinside.com 2019 - 2024. All rights reserved.