Liquibase generateChangeLog 命令生成无变更集

Posted

技术标签:

【中文标题】Liquibase generateChangeLog 命令生成无变更集【英文标题】:Liquibase generateChangeLog command generates No Change Sets 【发布时间】:2018-12-28 03:20:46 【问题描述】:

按照these 指令,在我现有的 PostgreSQL 数据库上执行 generateChangeLog 命令,生成的文件不包含变更集标签。也许我误解了一些东西,但我认为到目前为止对数据库的修改(创建的表等)已经在这里总结了,这就是“让它看起来像你一直在使用 Liquibase " 选项。

如果这不是一个正确的假设,并且如果我直接对要描述为变更集的数据库进行修改,那么如何使用 Liquibase 命令行将这些变更集添加到文件中?

编辑:

这是一个单步执行 generateChangeLog 和更新的示例:

./liquibase --driver=org.postgresql.Driver --classpath=postgresql-42.2.4.jar --changeLogFile=changelog1.xml --url="jdbc:postgresql://localhost:5432/my_database" --username=postgres --password=postgres --logLevel=debug generateChangeLog

输出:

调试 7/20/18 晚上 8:15:liquibase:连接到 postgres@jdbc:postgresql://localhost:5432/my_database

DEBUG 7/20/18 8:15 PM:liquibase:将自动提交从 true 设置为 false

调试 2018 年 7 月 20 日晚上 8:15:liquibase:1532117738554 的计算校验和为 2d79fcfb744a18b475eac6c1d1bd804d

DEBUG 7/20/18 8:15 PM:liquibase:执行 QUERY 数据库命令:SELECT c.relname AS SEQUENCE_NAME FROM pg_class c join pg_namespace on c.relnamespace = pg_namespace.oid WHERE c.relkind='S' AND nspname = 'public' AND c.oid not in (select d.objid FROM pg_depend d where d.refobjsubid > 0)

INFO 7/20/18 8:15 PM:liquibase:changelog1.xml 不存在,正在创建

调试 2018 年 7 月 20 日晚上 8:15:liquibase:MissingObjectChangeGenerator 类型顺序:liquibase.structure.core.Catalog liquibase.structure.core.Schema liquibase.structure.core.Sequence liquibase.structure.core.StoredProcedure liquibase。 structure.core.Table liquibase.structure.core.Column liquibase.structure.core.PrimaryKey liquibase.structure.core.UniqueConstraint liquibase.structure.core.Index liquibase.structure.core.ForeignKey liquibase.structure.core.View

DEBUG 7/20/18 8:15 PM:liquibase:UnexpectedObjectChangeGenerator 类型顺序:liquibase.structure.core.Catalog liquibase.structure.core.ForeignKey liquibase.structure.core.Schema liquibase.structure.core.StoredProcedure liquibase。 structure.core.UniqueConstraint liquibase.structure.core.View liquibase.structure.core.Table liquibase.structure.core.PrimaryKey liquibase.structure.core.Column liquibase.structure.core.Index liquibase.structure.core.Sequence

DEBUG 7/20/18 8:15 PM:liquibase:ChangedObjectChangeGenerator 类型顺序:liquibase.structure.core.Catalog liquibase.structure.core.ForeignKey liquibase.structure.core.Schema liquibase.structure.core.Sequence liquibase。 structure.core.StoredProcedure liquibase.structure.core.Table liquibase.structure.core.Column liquibase.structure.core.PrimaryKey liquibase.structure.core.UniqueConstraint liquibase.structure.core.Index liquibase.structure.core.View Liquibase 'generateChangeLog' 成功

此时在我的本地 PostgreSQL 服务器中,my_database 有 2 个模式,一个名为 my_schema(包含 11 个填充有我的应用程序正在使用的数据的表),另一个名为 public。公众没有桌子。

运行 liquibase 更新:

./liquibase --driver=org.postgresql.Driver --classpath=postgresql-42.2.4.jar --changeLogFile=changelog1.xml --url="jdbc:postgresql://localhost:5432/my_database" --username=postgres --password=postgres --logLevel=debug update

返回:

调试 7/20/18 晚上 8:21:liquibase:连接到 postgres@jdbc:postgresql://localhost:5432/my_database

DEBUG 7/20/18 8:21 PM:liquibase:将自动提交从 true 设置为 false

DEBUG 7/20/18 8:21 PM:liquibase:执行 QUERY 数据库命令:从 public.databasechangeloglock 中选择 count(*)

DEBUG 7/20/18 8:21 PM:liquibase:创建数据库锁定表 DEBUG 7/20/18 8:21 PM:liquibase:执行 EXECUTE 数据库命令:CREATE TABLE public.databasechangeloglock(ID INT NOT NULL,LOCKED BOOLEAN NOT NULL,LOCKGRANTED TIMESTAMP WITHOUT TIME ZONE,LOCKEDBY VARCHAR(255),CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID))

DEBUG 7/20/18 8:21 PM:liquibase:创建了名称为 public.databasechangeloglock 的数据库锁表

DEBUG 7/20/18 8:21 PM:liquibase:执行 QUERY 数据库命令:从 public.databasechangeloglock 中选择 count(*)

DEBUG 7/20/18 8:21 PM:liquibase:初始化数据库锁定表

DEBUG 7/20/18 8:21 PM:liquibase:执行 EXECUTE 数据库命令:DELETE FROM public.databasechangeloglock

DEBUG 7/20/18 8:21 PM:liquibase:执行 EXECUTE 数据库命令:INSERT INTO public.databasechangeloglock (ID, LOCKED) VALUES (1, FALSE)

DEBUG 7/20/18 8:21 PM:liquibase:执行 QUERY 数据库命令:SELECT LOCKED FROM public.databasechangeloglock WHERE ID=1

调试 2018 年 7 月 20 日晚上 8:21:liquibase:锁定数据库

DEBUG 7/20/18 8:21 PM:liquibase:执行 UPDATE 数据库命令:UPDATE public.databasechangeloglock SET LOCKED = TRUE,LOCKEDBY = '10.0.2.15 (10.0.2.15)',LOCKGRANTED = '2018-07- 20 20:21:26.650' 其中 ID = 1 并且锁定 = FALSE INFO 7/20/18 8:21 PM:liquibase:成功获取更改日志锁定

调试 7/20/18 晚上 8:21:liquibase:解析 XML 实体 name='null',publicId='null',baseURI='null',systemId='http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd'

DEBUG 7/20/18 8:21 PM:liquibase:打开 jar:file:/home/vagrant/Documents/liquibase.jar!/liquibase/parser/core/xml/dbchangelog-3.5.xsd 作为 liquibase/parser /core/xml/dbchangelog-3.5.xsd

DEBUG 7/20/18 8:21 PM:liquibase:1532118089029 的计算校验和为 cfbe2a0b147c646104f738103a68b2fd

DEBUG 7/20/18 8:21 PM:liquibase:创建数据库更改日志表

INFO 7/20/18 8:21 PM:liquibase:创建名称为 public.databasechangelog 的数据库历史表

DEBUG 7/20/18 8:21 PM:liquibase:执行 EXECUTE 数据库命令:CREATE TABLE public.databasechangelog(ID VARCHAR(255) NOT NULL,AUTHOR VARCHAR(255) NOT NULL,FILENAME VARCHAR(255) NOT NULL , DATEEXECUTED TIMESTAMP WITH TIME ZONE 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))

DEBUG 7/20/18 8:21 PM:liquibase:执行 QUERY 数据库命令:从 public.databasechangelog 中选择 count(*)

INFO 7/20/18 晚上 8:21:liquibase:从 public.databasechangelog 读取

DEBUG 7/20/18 8:21 PM:liquibase:执行 QUERY 数据库命令:SELECT * FROM public.databasechangelog ORDER BY DATEEXECUTED ASC,ORDEREXECUTED ASC

DEBUG 7/20/18 8:21 PM:liquibase:执行 QUERY 数据库命令:从 public.databasechangeloglock 中选择 count(*)

调试 7/20/18 晚上 8:21:liquibase:释放数据库锁

DEBUG 7/20/18 8:21 PM:liquibase:执行 UPDATE 数据库命令:UPDATE public.databasechangeloglock SET LOCKED = FALSE,LOCKEDBY = NULL,LOCKGRANTED = NULL WHERE ID = 1

INFO 7/20/18 8:21 PM:liquibase:成功释放更改日志锁

Liquibase 更新成功

现在在 Public 模式下,有 2 个表,databasechangelog 和 databasechangeloglock。 databasechangelog 为空,但 databasechangeloglock 包含一行 id 为 1 和“locked boolean” col “FALSE”。

【问题讨论】:

假设是正确的。 generateChangeLog 命令应生成一个变更集文件,其中包含创建现有数据库的所有“更改”。如果它是空的,那就错了。 您是否多次运行该命令?如果是这样,那么您可能需要清除更改表以获得干净的结果。 第一次运行命令后,我什至没有看到正在创建新表。在那之后我跑了几次都没用。 实际上,我看到这些表是在不同的架构中创建的。我会清理干净再试一次。 generateChangeLog 生成一个没有变更集元素的文件。然后 update 创建一个 databasechangelog 和 databasechangeloglock 表。 databasechangelog 表没有条目。 【参考方案1】:

我意识到我没有指定正确的架构。我在数据库示例中有 2 个,“public”和“my_schema”,而 Liquibase 显然默认为公共模式。

使用以下内容成功生成变更集:

./liquibase --driver=org.postgresql.Driver --classpath=postgresql-42.2.4.jar --changeLogFile=changelog.xml --url="jdbc:postgresql://localhost:5432/my_database?currentSchema=my_schema" --username=postgres --password=postgres --liquibaseSchemaName=my_schema generateChangeLog

【讨论】:

以上是关于Liquibase generateChangeLog 命令生成无变更集的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Liquibase 强制列顺序?

liquibase的使用

使用 Liquibase 创建雪花存储过程

Liquibase-数据库版本管理使用

Liquibase:如何使用 CURRENT_TIMESTAMP 加载数据?

Liquibase maven插件不起作用