我使用Liquibase来支持数据库的MSSQL和Oracle实现。数据库已经存在。
我想支持表格列上的整理。例如:
<createTable tableName="my_table">
<column autoIncrement="true" name="id" type="int">
<constraints nullable="false"/>
</column>
<column name="name" type="varchar(50)"/>
<ext:column name="description" type="varchar(250)" collate="Latin1_General_CS_AS"/>
</createTable>
我想最初只处理MSSQL的新属性。我已经看到modifySql
标记提供了一种在不使用扩展名的情况下支持collate
的方法。我也想做其他类似的改变,并且更喜欢扩展Liquibase的想法。
我查看了其他扩展,但找不到如何很好地扩展现有语句的示例。我正在考虑做以下事情:
编写扩展核心CreateTableChange
,CreateTableStatement
和CreateTableGenerator
的自定义CreateTableChange
,CreateTableStatement
和CreateTableGenerator
类。替换generateStatements
中的CreateTableChange
方法以创建自定义CreateTableStatement
个实例,并替换generateSql
中的CreateTableGenerator
。
我想知道这是否是扩展现有更改类的正确方法。我担心我无法调用generateStatements
和generateSql
的基本实现,但必须复制并粘贴实现,它开始看起来像一个新的更改类型而不是扩展现有的。
答案 0 :(得分:0)
我在为liquibase编写扩展方面没有太多经验,所以我无法告诉你这是一个好方法还是有更好的方法。
但我注意到有两个包:liquibase.change
和liquibase.change.core
。在第一个包中是抽象类和接口,如AbstractChange
。我想这些是你在编写扩展时应该实现和扩展的那些。因此,我认为该包作为扩展API的一部分,因此非常“稳定”。
第二个包包含liquibase自己使用的类。它们可能(将)在未来版本中进行更改。 因此,当您扩展这些类时,您的扩展可能需要更频繁地更改。我猜这些类不是“扩展API”的一部分。 (我没有找到任何证明这一点的官方文件 - 这只是我的观察。)
除此之外,我会说你的方法应该是可行的。