Liquibase Java,变更集不适用

iugsix8n  于 5个月前  发布在  Java
关注(0)|答案(6)|浏览(82)

我目前正在为我的实习构建一个项目,我被困了两天,试图在java中使用Liquibase。一切似乎都很正常:找到了更改日志文件,正确的URI,用户名和密码;但是当我运行它时,我的更改集没有被处理。
我使用这个类来管理我的程序中的liquibase操作,例如 rollbackupdateupdateSQLfutureRollbackSQL,给定一个更新日志和最终的目标文件。如果源或目标来自远程服务器,我使用一些SSH交互(scp to,scp from)与JSch和临时文件(但这不是主题)。
这是我现在的java代码,给定dbuserpasswdrealAction是之前设置的,changelogpathdest是一些数据存储类。

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());
        }
    }
}

字符串
以下是我的changelog:

<?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)?
谢谢你的回答。

**EDIT 06/08/2015:**我在调试模式下获得了日志(故意更改了架构名称):

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

mec1mxoz

mec1mxoz1#

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

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

字符串
其中logLevel是字符串“debug”

nfeuvbwi

nfeuvbwi3#

我遇到同样的问题,即使问题真的很老,我会尽量给给予一个答案。代码是错误的两点:

  • 变换路径
  • 第一个月

如果路径不可读,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("");

字符串

ki1q1bka

ki1q1bka4#

我分享了我发现的解决方案,以修复运行liquibase update时未应用的更改。请注意,我没有使用Java,我将我的更改日志作为.sql文件管理。我使用Snowflake JDBC驱动程序。为我修复它的事情是在liquibase.properties文件中显式定义defaultCatalogNamedefaultSchemaName属性。只需在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文章的人。

7jmck4yq

7jmck4yq5#

我也有类似的问题,在那里没有执行更改。.我改变了xsd版本从3.1到3.4,它的工作。

kxeu7u2r

kxeu7u2r6#

我遇到了一个类似的问题,当我使用SpringLiquibaseschema per tenant时,没有应用更改。
我需要设置liquibase.setLabelFilter(schemaName)来解决更改日志缓存问题。

相关问题