如何在 Liquibase 中定义一组默认列 def. PK,定义。索引,定义。表创建的值?
Posted
技术标签:
【中文标题】如何在 Liquibase 中定义一组默认列 def. PK,定义。索引,定义。表创建的值?【英文标题】:How to define in Liquibase a set of default columns, def. PKs, def. indexes, def. values for table creation? 【发布时间】:2014-08-10 11:21:18 【问题描述】:我只是环顾四周,以减少在 liquibase 上创建表的工作量和错误。
是否可以为表格创建一组默认列?
列:
int ID varchar UUID timestamp createdTs 时间戳更新Ts int lockVersion约束
ID 不为 NULL 并且使用自动生成的键(作为主键) UUID 不为 NULL createdTS 不为 NULL,默认为 CURRENT_TIMESTAMP updatedTS 不为 NULL,默认为 CURRENT_TIMESTAMP lockVersion 不为 NULL索引
身份证 UUID例如: genericTable.xml
<changeSet author="me" id="myCsId">
<column name="id" type="int" />
<column name="uuid" type="varchar(255)" />
<column name="rowCreated" type="datetime" />
<column name="rowUpdated" type="datetime" />
<addNotNullConstraint columnName="id" schemaName="$schema" tableName="???" columnDataType="int" />
<addNotNullConstraint columnName="uuid" schemaName="$schema" tableName="???" columnDataType="varchar(255)" />
<addNotNullConstraint columnName="rowCreated" schemaName="$schema" tableName="???" columnDataType="timestamp" />
<addNotNullConstraint columnName="rowUpdated" schemaName="$schema" tableName="???" columnDataType="timestamp" />
<addPrimaryKey columnNames="ID" constraintName="pk_myKey" schemaName="$schema" tableName="???" />
....
</changelog>
现在创建一个不同的变更日志,例如:
<changeSet author="me" id="myCrazyLazyTable1">
<include file="genericTable.xml" /> <!-- how to pass values like myCrazyLazyTable1 to only this included region to replace the above ??? -->
<column name="anyadditionlColumn" type="int"/>
</changeset>
<changeSet author="me" id="myCrazyLazyTable2">
<include file="genericTable.xml" /> <!-- how to pass values like myCrazyLazyTable2 to only this included region to replace the above ??? -->
<column name="anyadditionlColumn" type="int"/>
</changeset>
有人可以帮我走出黑暗吗?
【问题讨论】:
真的没有帮助吗? 也许这有帮助? ***.com/questions/14473460/… 或这个***.com/questions/25840467/liquibase-common-columns/… 【参考方案1】:我得到了一些提示,但无法通过提示解决问题。所以我不得不摆弄才能找到以下解决方案。因为我喜欢这里的完整示例,所以是一个正在运行的示例。 该示例展示了如何为默认列和默认约束创建可重用的默认表结构。
我的 MasterChangelog.xml 引用变更集/变更日志
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.3.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<!-- You can replace the XML-files between the brackets with your XML-files. -->
<!-- Caution! You have to save your XML-files in the same Folder that contains the MasterChangelog.xml -->
<include relativeToChangelogFile="true" file="001_CreateTranslations.xml" />
</databaseChangeLog>
现在更改日志本身是 001_CreateTranslations.xml。它重用了模板 Table 000_DefaultTable.xml 以及 000_DefaultProperties.dtd 中的一些可重用属性。 因此,此示例在第一个变更集中创建具有所需表名的默认表结构,并在第二个变更集中创建带有 addColumn xml 标记的附加列
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE defaultProperties SYSTEM "000_DefaultProperties.dtd">
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.3.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<!-- include the default properties -->
&propertiesAll;
<property name="table.schema" value="$schema" />
<property name="table.name" value="Translations" />
<property name="table.author" value="cilap" />
<property name="changeset.number" value="001" />
<property name="changeset.operation" value="Create" />
<property name="changeset.name" value="$changeset.number_$changeset.operation$table.name" />
<!-- create default table $table.name -->
<include file="000_DefaultTable.xml" relativeToChangelogFile="true" />
<changeSet author="$table.author" id="$changeset.name">
<addColumn schemaName="$schema" tableName="$table.name">
<column name="country" type="VARCHAR(255)" />
</addColumn>
</changeSet>
</databaseChangeLog>
我的 XML 实体在 000_DefaultProperties.dtd 中
<!ENTITY propertyNow "
<property name='now' value='sysdate' dbms='oracle' />
<property name='now' value='now()' dbms='mysql' />
<property name='now' value='CURRENT_TIMESTAMP' dbms='h2' />
<property name='now' value='CURRENT_TIMESTAMP' dbms='postgresql' />
" >
<!ENTITY propertySchema "
<property name='schema' value='redd' dbms='mysql' />
<property name='schema' value='PUBLIC' dbms='h2' />
" >
<!ENTITY propertiesAll "&propertySchema; &propertySchema;" >
我的默认/模板表是 000_DefaultTable.xml
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.3.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<!-- default changeset for a standard table to use -->
<!-- set the properties -->
<!-- <property name="table.schema" value="$schema" /> -->
<!-- <property name="table.name" value="Translations" /> -->
<!-- <property name="table.author" value="cilap" /> -->
<!-- <property name="changeset.number" value="001" /> -->
<!-- <property name="changeset.operation" value="Create" /> -->
<!-- <property name="changeset.name" value="$changeset.number_$changeset.operation$table.name" /> -->
<changeSet author="$table.author" id="$changeset.nameDefault">
<createTable schemaName="$table.schema" tableName="$table.name">
<column name="Id" type="int" />
<column name="Uuid" type="varchar(255)" />
<column name="RowCreated" type="datetime" />
<column name="RowUpdated" type="datetime" />
</createTable>
<!-- mandatory not null constraints on default columns -->
<addNotNullConstraint columnName="Id" schemaName="$table.schema" tableName="$table.name" columnDataType="int" />
<addNotNullConstraint columnName="Uuid" schemaName="$table.schema" tableName="$table.name" columnDataType="varchar(255)" />
<addNotNullConstraint columnName="RowCreated" schemaName="$table.schema" tableName="$table.name"
columnDataType="datetime" />
<addNotNullConstraint columnName="RowUpdated" schemaName="$table.schema" tableName="$table.name"
columnDataType="datetime" />
<!-- create primary key -->
<addPrimaryKey columnNames="Id" constraintName="pk_$table.name" schemaName="$table.schema" tableName="$table.name" />
<addAutoIncrement tableName="$table.name" columnName="Id" columnDataType="int" />
<!-- create unique index on uuid -->
<createIndex indexName="Idx$table.nameUuid" schemaName="$table.schema" tableName="$table.name" unique="true">
<column name="Uuid" type="varchar(255)" />
</createIndex>
</changeSet>
</databaseChangeLog>
【讨论】:
【参考方案2】:Liquibase 中没有内置任何东西来支持这一点。
您最简单的选择是使用纯 XML 级别的 XML 文档实体,因此对 Liquibase 是透明的。它们将允许您将通用 XML 附加到您的更改日志文件中。
更复杂的方法是使用 Liquibase 扩展系统 (http://liquibase.org/extensions),它允许您重新定义将 changeSets 转换为 SQL 的逻辑。这将允许您注入任何您想要的逻辑,包括常见数据类型、标准列或其他任何内容。
【讨论】:
您好内森,感谢您的回答。你能给我一个结合 liquibase 的 XML 文档实体的例子吗?以上是关于如何在 Liquibase 中定义一组默认列 def. PK,定义。索引,定义。表创建的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在liquibase中设置当月第一个日期和下个月的默认值?