【问题标题】:Generating Liquibase metadata offline离线生成 Liquibase 元数据
【发布时间】:2014-03-31 09:05:14
【问题描述】:

我目前正在尝试使用 Liquibase 为我们的数据库迁移生成 SQL。由于我们环境中的一些限制,我们需要“离线”生成 SQL,然后由 DBA 针对目标数据库执行。

我已经能够将 updateSQL / rollbackSQL 与 Maven 插件一起使用来生成 SQL,这似乎工作正常。

但是,输出不包含任何元数据信息 - 即,没有创建 DATABASECHANGELOG 表,并且该表的任何插入都不包含在生成的脚本中。

是否可以在生成的 SQL 中包含元数据信息?

我使用的是 Liquibase 3.1.1(Maven 插件是同一版本)。我也从命令行尝试过这个并且行为是一致的 - 即我得到了生成的实际更改,但没有生成元数据。

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    3.1.1 目前不支持。它有望在 3.2 中添加为功能。 https://liquibase.jira.com/browse/CORE-1726.

    您能否针对与生产相匹配的备份数据库运行 updateSQL?这仍然不会执行任何操作,但也会包含元数据语句。备份实际上只需要 databasechangelog 表,因为这是所有 liquibase 读取,除非您使用前置条件。

    【讨论】:

    • 谢谢内森。我会关注这个问题,因为它看起来很适合我们的场景。我们很可能能够针对备份数据库运行,所以我会尝试一下,看看效果如何。
    【解决方案2】:

    使用“outputLiquibaseSql=true”选项运行主方法,如下所示:

    liquibase.integration.commandline.Main.main(new String[]{"--changeLogFile=src/test/resources/db.changelog.xml"
                    ,"--outputFile=target/updateSql.txt"
                    ,"--url=offline:unknown?outputLiquibaseSql=true"
                    , "updateSQL"});
    

    生成如下 SQL:

    -- *********************************************************************
    -- Update Database Script
    -- *********************************************************************
    -- Change Log: src/test/resources/db.changelog.xml
    -- Ran at: 12/04/20 11:51
    -- Against: null@offline:unknown?outputLiquibaseSql=true
    -- Liquibase version: 3.8.9
    -- *********************************************************************
    
    CREATE TABLE DATABASECHANGELOG (ID VARCHAR(255) NOT NULL, AUTHOR VARCHAR(255) NOT NULL, FILENAME VARCHAR(255) NOT NULL, DATEEXECUTED datetime NOT NULL, ORDEREXECUTED INT NOT NULL, EXECTYPE VARCHAR(10) NOT NULL, MD5SUM VARCHAR(35), DESCRIPTION VARCHAR(255), COMMENTS VARCHAR(255), TAG VARCHAR(255), LIQUIBASE VARCHAR(20), CONTEXTS VARCHAR(255), LABELS VARCHAR(255), DEPLOYMENT_ID VARCHAR(10));
    
    -- Changeset src/test/resources/db.changelog.xml::createTable-example::liquibase-docs
    CREATE TABLE public.person (address VARCHAR(255));
    
    INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('createTable-example', 'liquibase-docs', 'src/test/resources/db.changelog.xml', CURRENT_TIMESTAMP, 1, '8:49e8eb557129b33d282c4ad2fdc5d4d9', 'createTable tableName=person', '', 'EXECUTED', NULL, NULL, '3.8.9', '6688703163');
    

    当它在“离线:未知”模式下运行时,它还会输出 CSV,这些条目是要放入 DATABASECHANGELOG 表的条目:

    "ID","AUTHOR","FILENAME","DATEEXECUTED","ORDEREXECUTED","EXECTYPE","MD5SUM","DESCRIPTION","COMMENTS","TAG","LIQUIBASE","CONTEXTS","LABELS","DEPLOYMENT_ID"
    "createTable-example","liquibase-docs","src/test/resources/db.changelog.xml","2020-04-12T11:51:43.178","2","EXECUTED","8:49e8eb557129b33d282c4ad2fdc5d4d9","createTable tableName=person",,"","3.8.9","()","","6688703163"
    
    

    【讨论】:

      猜你喜欢
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      相关资源
      最近更新 更多