Liquibase 在执行变更集之前检查 table 名称长度
Liquibase check table name length before executing changset
我正在使用 Java 代码中的 Liquibase 更新方法将一些实体保存在 PostgreSQL 数据库中。
有没有办法在 Liquibase 在数据库中创建表和列名称之前检查它们的长度?像先决条件 SQL 检查或 Java 代码?
我看到两个可能的解决方案:
仅使用 Java
您可以使用 Liquibase 类 加载变更日志,遍历所有 createTable
标签并检查 table 名称和列名称的长度。
代码大纲:
File changeLogFile = new File("...");
FileSystemResourceAccessor accessor = new FileSystemResourceAccessor(changeLogFile.getAbsoluteFile().getParent());
DatabaseConnection db = new JdbcConnection(...);
Liquibase lb = new Liquibase(changeLogFile.getAbsolutePath(), accessor, db);
DatabaseChangeLog changeLog = lb.getDatabaseChangeLog();
List<ChangeSet> changeSets = changeLog.getChangeSets();
for (ChangeSet cs : changeSets) {
for (Change change : changeSet.getChanges()) {
if (change instanceof CreateTableChange) {
// check the table that is created
}
}
}
另一种获取变更集列表的方法是使用 ChangeLogIterator
和 ShouldRunChangeSetFilter
。这样,您将需要 ChangeSetVisitor
来处理变更集。
使用 XSLT
以下 XSLT 提取所有 table 长度超过 20 个字符的名称并将其写入 HTML 文件。
您可以调整它以过滤不同的长度:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:lb="http://www.liquibase.org/xml/ns/dbchangelog">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>Tablenames</title>
</head>
<body>
<table border="1" class="change-table">
<tr>
<td class="table-heading">ChangeSet</td>
<td class="table-heading">Tablename</td>
<td class="table-heading">Length of name</td>
</tr>
<xsl:apply-templates select="//lb:createTable"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="lb:createTable">
<xsl:if test="string-length(@tableName) > 20">
<tr>
<td class="table-row change-set"><xsl:value-of select="../@author"/><xsl:text>::</xsl:text><xsl:value-of select="../@id"/></td>
<td class="table-row object-name"><xsl:value-of select="@tableName"/></td>
<td class="table-row object-name"><xsl:value-of select="string-length(@tableName)"/></td>
</tr>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
我正在使用 Java 代码中的 Liquibase 更新方法将一些实体保存在 PostgreSQL 数据库中。
有没有办法在 Liquibase 在数据库中创建表和列名称之前检查它们的长度?像先决条件 SQL 检查或 Java 代码?
我看到两个可能的解决方案:
仅使用 Java
您可以使用 Liquibase 类 加载变更日志,遍历所有 createTable
标签并检查 table 名称和列名称的长度。
代码大纲:
File changeLogFile = new File("...");
FileSystemResourceAccessor accessor = new FileSystemResourceAccessor(changeLogFile.getAbsoluteFile().getParent());
DatabaseConnection db = new JdbcConnection(...);
Liquibase lb = new Liquibase(changeLogFile.getAbsolutePath(), accessor, db);
DatabaseChangeLog changeLog = lb.getDatabaseChangeLog();
List<ChangeSet> changeSets = changeLog.getChangeSets();
for (ChangeSet cs : changeSets) {
for (Change change : changeSet.getChanges()) {
if (change instanceof CreateTableChange) {
// check the table that is created
}
}
}
另一种获取变更集列表的方法是使用 ChangeLogIterator
和 ShouldRunChangeSetFilter
。这样,您将需要 ChangeSetVisitor
来处理变更集。
使用 XSLT
以下 XSLT 提取所有 table 长度超过 20 个字符的名称并将其写入 HTML 文件。
您可以调整它以过滤不同的长度:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:lb="http://www.liquibase.org/xml/ns/dbchangelog">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>Tablenames</title>
</head>
<body>
<table border="1" class="change-table">
<tr>
<td class="table-heading">ChangeSet</td>
<td class="table-heading">Tablename</td>
<td class="table-heading">Length of name</td>
</tr>
<xsl:apply-templates select="//lb:createTable"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="lb:createTable">
<xsl:if test="string-length(@tableName) > 20">
<tr>
<td class="table-row change-set"><xsl:value-of select="../@author"/><xsl:text>::</xsl:text><xsl:value-of select="../@id"/></td>
<td class="table-row object-name"><xsl:value-of select="@tableName"/></td>
<td class="table-row object-name"><xsl:value-of select="string-length(@tableName)"/></td>
</tr>
</xsl:if>
</xsl:template>
</xsl:stylesheet>