我目前正在尝试使用Liquibase来为我们的数据库迁移生成SQL。由于我们环境中的一些限制,我们需要生成SQL"离线"然后由DBA对目标数据库执行该操作。
我已经能够将updateSQL / rollbackSQL与Maven插件一起使用来生成SQL,这似乎工作正常。
但是,输出不包含任何元数据信息 - 即DATABASECHANGELOG表没有创建,并且生成的脚本中不包含该表的任何插入。
是否可以在生成的SQL中包含元数据信息?
我使用的是Liquibase 3.1.1(Maven插件版本相同)。我也从命令行尝试了这个并且行为是一致的 - 即我得到了实际的更改,但没有生成元数据。
答案 0 :(得分:0)
目前3.1.1中没有支持。它有望被添加为3.2中的一个功能。 https://liquibase.jira.com/browse/CORE-1726
您是否能够针对与生产匹配的备份数据库运行updateSQL?这仍然不会执行任何操作,但也会包含元数据语句。备份实际上只需要databasechangelog表,因为除非你使用前提条件,否则这都是liquibase读取。
答案 1 :(得分:0)
使用选项“ outputLiquibaseSql = true”运行main方法,如下所示:
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"