# alter-table.ftl
在alter-table.ftl文件中用Freemaker构造一个SQL模板,使数据库支持alter table
语句。
<#--修改表ftl模板-->
<#--修改表注释-->
<#if (originAttributes.tableComment)?? && !(attributes.tableComment)??>
ALTER TABLE ${tableName} COMMENT '';
<#elseif (alterAttributes.tableComment)??>
ALTER TABLE ${tableName} COMMENT '${alterAttributes.tableComment}';
</#if>
<#--新增字段-->
<#if newColumns??>
<#list newColumns as col>
<#assign isVarchar = col.dbType=="VARCHAR"||col.dbType=="CHAR"|| col.dbType=='LONGTEXT'>
ALTER TABLE ${tableName} ADD ${col.name+" "}<#t>
<#if col.autoInc!false>
BIGINT NOT NULL AUTO_INCREMENT<#t>
<#else>
${col.typeDeclaration}<#if isVarchar> BINARY</#if><#t>
<#if !col.nullable!true> NOT NULL</#if><#t>
<#if col.defaultValue??> DEFAULT ${col.defaultValue}</#if><#t>
<#if col.unique!false> UNIQUE</#if><#t>
</#if>
<#if col.comment??> COMMENT '${col.comment}'</#if>;<#lt>
</#list>
</#if>
<#--删除字段, `删除`放到`新增`的下面,避免既有添加又有删除的时候,因为删除所有字段,导致数据库抛出异常-->
<#if dropColumns??>
<#list dropColumns as col>
ALTER TABLE ${tableName} DROP COLUMN ${col};<#lt>
</#list>
</#if>
<#--删除主键-->
<#if (primaryKey.drop)?? && primaryKey.drop>
ALTER TABLE ${tableName} DROP PRIMARY KEY;<#lt>
</#if>
<#--新增主键-->
<#if (primaryKey.parts)??>
ALTER TABLE ${tableName} ADD PRIMARY KEY (<#t>
<#list primaryKey.parts as part>
${part.column}<#sep>, </#sep><#t>
</#list>
);<#lt>
</#if>
<#--修改字段-->
<#if alterColumns??>
<#list alterColumns as col>
<#assign alterAttrs=col.alterAttributes>
<#assign originAttrs=col.originAttributes>
<#assign attrs=col.attributes>
<#assign isVarchar = originAttrs.dbType=="VARCHAR"||originAttrs.dbType=="CHAR"||originAttrs.dbType=='LONGTEXT'>
<#if alterAttrs.autoInc!false>
<#--修改自增长-->
ALTER TABLE ${tableName} MODIFY ${originAttrs.name} BIGINT NOT NULL AUTO_INCREMENT<#t>
<#if (originAttrs.comment)?? && !(attrs.comment)??> COMMENT ''<#elseif (alterAttrs.comment)??> COMMENT '${alterAttrs.comment}'<#elseif (originAttrs.comment)??> COMMENT '${originAttrs.comment}'</#if>;<#lt>
<#elseif alterAttrs.originalName??>
<#--字段更名-->
ALTER TABLE ${tableName} CHANGE ${alterAttrs.originalName} ${alterAttrs.name} ${originAttrs.typeDeclaration}<#if isVarchar> BINARY</#if><#t>
<#if !originAttrs.nullable!true> NOT NULL</#if><#t>
<#if originAttrs.defaultValue??> DEFAULT ${originAttrs.defaultValue}</#if><#t>
<#if originAttrs.unique!false> UNIQUE</#if><#t>
<#if (originAttrs.comment)??> COMMENT '${originAttrs.comment}'</#if>;<#lt>
<#elseif alterAttrs.typeDeclaration??>
<#--更改字段类型-->
ALTER TABLE ${tableName} MODIFY ${originAttrs.name} ${alterAttrs.typeDeclaration}<#if alterAttrs.dbType=="VARCHAR"||alterAttrs.dbType=="CHAR"> BINARY</#if><#t>
<#if (alterAttrs.nullable)??><#if !alterAttrs.nullable> NOT NULL</#if><#else><#if !originAttrs.nullable!true> NOT NULL</#if></#if><#t>
<#if (alterAttrs.defaultValue)??> DEFAULT ${alterAttrs.defaultValue}<#else><#if originAttrs.defaultValue??> DEFAULT ${originAttrs.defaultValue}</#if></#if><#t>
<#if (alterAttrs.unique)??><#if alterAttrs.unique> UNIQUE</#if><#else><#if originAttrs.unique!false> UNIQUE</#if></#if><#t>
<#if (originAttrs.comment)?? && !(attrs.comment)??> COMMENT ''<#elseif (alterAttrs.comment)??> COMMENT '${alterAttrs.comment}'<#elseif (originAttrs.comment)??> COMMENT '${originAttrs.comment}'</#if>;<#lt>
<#else>
<#--修改字段属性,比如长度,nullable,defaultValue,unique,comment-->
ALTER TABLE ${tableName} MODIFY ${originAttrs.name} ${originAttrs.typeDeclaration}<#if isVarchar> BINARY</#if><#t>
<#if (alterAttrs.nullable)??><#if !alterAttrs.nullable> NOT NULL</#if><#else><#if !originAttrs.nullable!true> NOT NULL</#if></#if><#t>
<#if (alterAttrs.defaultValue)??> DEFAULT ${alterAttrs.defaultValue}<#else><#if originAttrs.defaultValue??> DEFAULT ${originAttrs.defaultValue}</#if></#if><#t>
<#if (alterAttrs.unique)??><#if alterAttrs.unique> UNIQUE</#if><#else><#if originAttrs.unique!false> UNIQUE</#if></#if><#t>
<#if (originAttrs.comment)?? && !(attrs.comment)??> COMMENT ''<#elseif (alterAttrs.comment)??> COMMENT '${alterAttrs.comment}'<#elseif (originAttrs.comment)??> COMMENT '${originAttrs.comment}'</#if>;<#lt>
</#if>
</#list>
</#if>
<#--删除索引-->
<#if dropIndexes??>
<#list dropIndexes as index>
DROP INDEX ${index} ON ${tableName};<#lt>
</#list>
</#if>
<#--新增索引-->
<#if newIndexes??>
<#list newIndexes as index>
CREATE<#if index.unique!false> UNIQUE</#if> INDEX ${(index.name)!("IDX_AUTO_NAME_" + index?index)} ON ${tableName} (<#t>
<#list index.parts as part>
${part.column}<#sep>, </#sep><#t>
</#list>
);<#lt>
</#list>
</#if>
# SQL参数模板
# tableName
目标数据表表名。
# tableType
数据库表类型,具体类型如下所示:
TABLE
:物理表,可以select和update数据LOCAL_TEMPTABLE
:本地临时表,只在当前连接可见,当前连接物理关闭时删除GLOBAL_TEMPTABLE
:全局临时表,所有连接可见,通常是引用过它的连接关闭时自动删除
# originAttributes
数据库表修改前的表属性,包括表注释,存储引擎,分布列等属性。
catalog
:schema
:数据库表所在schematableName
:目标数据表表名。mixedCase
:查询表时是否需要转义,为true表示此表的大小写和数据库标准不一致,需要进行转义。tableType
:返回数据表的类型,具体可参考tableComment
:返回表的注释,没有注释时返回null
。distributionColumn
:当目标数据库是分布式存储数据库时,返回分布字段的名称。primaryKeys
:返回主键的值,没有时返回null
。indexes
:返回索引列表。columns
:返回全部字段列表。
# alterAttributes
返回修改后数据表的属性,结构同originAttributes,未修改的属性没有值。
# attributes
返回修改后的完整的表属性,结构同originAttributes。
# newColumns
新增字段的字段列表,是一个数组对象,每个元素都是一个字段,字段属性和createtable-columns中的字段对象一致。
# dropColumns
需要删除的字段列表,是一个字段名数组。
# alterColumns
需要修改的字段列表,包含了字段需要修改的所有信息,是一个对象数组。
属性如下:
# primarKey
若SQL模板中存在此属性,表示主键有修改,此对象和索引对象可以访问的属性一致,并新增一下2个属性:
drop
:为true表示需要删除原主键,如果原来的表有主键,但是新主键是不同的字段,需要先drop
掉原来的主键。columns
:新主键的字段列表。
# newIndexes
新增的索引,是一个数组对象,每一个元素都是一个索引,可访问的属性参考createtable-indexes。
# dropIndexes
要删除的索引列表,是一个数组对象,每个元素都是要删除的索引名称。
0条评论
评论