Liquibase 根据表名前缀在 db 上生成更改日志

Posted

技术标签:

【中文标题】Liquibase 根据表名前缀在 db 上生成更改日志【英文标题】:Liquibase generate change log on db based on table name prefix 【发布时间】:2020-05-14 14:50:03 【问题描述】:

我可以根据表名前缀从数据库生成 Liquibase 更改日志吗?

示例: 如果我有一个数据库架构并且它有以下表格:

abc
abcd
abcdef
xyz

我只想为以“abc”开头的表生成 ChangeLog。所以表格的更新日志

ABC, A B C D, abcdef

如果有办法,有人可以帮助我吗?

【问题讨论】:

【参考方案1】:

如果您使用的是 liquibase 版本 > 3.3.2,则可以使用 maven 或 liquibase 命令行。

看看release notes

Liquibase 3.3.2 正式发布。它主要是一个错误修复 发布,但有一个主要的新特性:对象 diffChangeLog/generateChangeLog 对象过滤。 includeObjects/excludeObjects 逻辑

您现在可以在 命令行或 Ant。对于 maven,参数是 diffExcludeObjects 和 diffIncludeObjects。这些参数的格式是:

An object name (actually a regexp) will match any object whose name matches the regexp.
A type:name syntax that matches the regexp name for objects of the given type
If you want multiple expressions, comma separate them
The type:name logic will be applied to the tables containing columns, indexes, etc.

注意:名称比较区分大小写。如果你想要不敏感 逻辑,使用 (?i) 正则表达式标志。

过滤器示例:

“table_name” will match a table called “table_name” but not “other_table” or “TABLE_NAME”
“(i?)table_name” will match a table called “table_name” and “TABLE_NAME”
“table_name” will match all columns in the table table_name
“table:table_name” will match a table called table_name but not a column named table_name
“table:table_name, column:*._lock” will match a table called table_name and all columns that end with “_lock”

所以尝试在generateChangeLog 命令中使用excludeObjectsincludeObjects 参数

更新

我使用了 liquibase 命令行,这个命令可以解决问题(对于 mysql 数据库):

liquibase 
--changeLogFile=change.xml 
--username=username 
--password=password 
--driver=com.mysql.cj.jdbc.Driver 
--url=jdbc:mysql://localhost:3306/mydatabase
--classpath=mysql-connector-java-8.0.18.jar 
--includeObjects="table:abc.*" 
generateChangeLog

【讨论】:

我正在运行以下命令 mvn liquibase:generateChangeLog -DincludeObjects="abc*" 但仍然面临问题 你必须写 -DincludeObjects="table:abc*" 如***.com/questions/38706429/…中所见 @AvikKesari 我已经更新了答案。您需要使用--includeObjects="table:abc.*"【参考方案2】:

这对我有用 Windows 10:

liquibase.properties:

changeLogFile=dbchangelog.xml
classpath=C:/Program\ Files/liquibase/lib/mysql-connector-java-8.0.20.jar
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/liquibase?serverTimezone=UTC
username=root
password=password
schemas=liquibase
includeSchema=true
includeTablespace=true
includeObjects=table:persons

C:\Users\用户名\桌面>liquibase generateChangeLog

Liquibase Community 4.0.0 by Datical
Starting Liquibase at 11:34:35 (version 4.0.0 #19 built at 2020-07-13 19:45+0000)
Liquibase command 'generateChangeLog' was executed successfully.

您可以下载 mysql-connector here,查找 generateChangeLog 文档 here 以及有关 includeObjects here 的更多信息。

【讨论】:

以上是关于Liquibase 根据表名前缀在 db 上生成更改日志的主要内容,如果未能解决你的问题,请参考以下文章

根据时间段和数据库表名的前缀获取表名

liquibase的使用

为啥 liquibase 无法解析 db.changelog 类路径?

liquibase hsql db列创建错误

Liquibase DB 独立插入语句

如何告诉Liquibase忽略db.changelog * .xml?