如何给GBASE 8A建表语句中动态设置分区

Viewed 35
  1. 设置分区需要使用数据表的自定义属性,先在【项目设置】中调整并开启表的自定义属性,如下图:

61b80eb820dccff20080f882b6c9f73.png

  1. 修改数据库代码模板,如下图:

    565d8dc7a36284cc55760257988463a.png

    637efc5dbf367efb206b2307af7091b.png

  2. 完整代码模板如下(可参考下方模板):

{{
    let schemaName = it.schemaName ? `${it.schemaName}.` : '';
    const tableKey = `${schemaName}${it.defKey}`;
    let distributedClause = '',partitionClause='';
    let partitions = [it.attr5,it.attr6,it.attr7,it.attr8,it.attr9,it.attr10,it.attr11,it.attr12];
    
    if(it.attr1==='DISTRIBUTED' && it.attr2){
        distributedClause = ` DISTRIBUTED ${it.attr2} `;
    }else if(it.attr1==='REPLICATED'){
        distributedClause = 'REPLICATED DEFAULT ';
    }
    
    if(it.attr3==1){
        partitionClause = `PARTITION ${it.attr4}`;
        let partitionParts = partitions.filter(item => item !== null && item !== '' && item !== undefined)
                                    .map(item => `PARTITION ${item}`)
                                    .join(',\n');
        partitionClause += '\n(';
        partitionClause += partitionParts;
        partitionClause += ')';
        
    }



    function getDataType(field) {
        const dataType = field.dbDataType.toUpperCase();
        if (['VARCHAR'].includes(dataType)) {
            return `${dataType}(${field.dataLen ? field.dataLen : 128})`;
        } else if (['BOOLEAN','DATE','LONGBLOB','TIME'].includes(dataType)) {
            return dataType;
        } else if (dataType === 'FLOAT') {
            return field.dataLen && field.dataLen >= 1 && field.dataLen <= 53 ? `${dataType}(${field.dataLen})` : dataType;
        }  else if (dataType === 'DOUBLE') {
           return field.dataLen && field.dataLen >= 0 && field.dataLen <= 30 ? (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen ? `${dataType}(${field.dataLen},${field.numScale})`  : `${dataType}(${field.dataLen},30)`) : `${dataType}(30,30)`;
        } else if (dataType === 'DECIMAL') {
          return field.dataLen && field.dataLen >= 0 && field.dataLen <= 255 ? (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen ? `${dataType}(${field.dataLen},${field.numScale})`  : `${dataType}(${field.dataLen})`) : `${dataType}`;
        } else {
            return field.dataLen && field.dataLen >= 0 ? `${dataType}(${field.dataLen})` : dataType;
        }
    }

    function getFieldDefinition(field, index, fields) {
        const dataType = getDataType(field);
        const notNull = field.notNull ? ' NOT NULL' : ' NULL';
        const autoIncrement = field.autoIncrement ? ' AUTO_INCREMENT' : '';
        const defaultValue = field.defaultValue ? ` DEFAULT ${field.defaultValue}` : '';
        const comment = (field.defName || field.intro) ? ` COMMENT '${field.defName}${field.defName && field.intro ? "; " : ""}${field.intro}'` : '';
        return `"${field.defKey}" ${dataType}${notNull}${autoIncrement}${defaultValue}${comment}${index < fields.length - 1 || pkList.length > 0 ? ',' : ''}`;
    }
}}
DROP TABLE IF EXISTS {{= tableKey }};

CREATE TABLE {{= tableKey }}(
{{ pkList = [] ; }}
{{~it.fields:field:index}}
    {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}
    {{= getFieldDefinition(field, index, it.fields) }}
{{~}}
{{? pkList.length > 0 }}
    PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i < pkList.length - 1 ? ',' : '' }}{{~}})
{{?}}
){{=distributedClause}}{{? (it.intro && it.intro !== '') || (it.defName && it.defName !== '') }} COMMENT '{{=it.defName ? it.defName + "" : ""}}'{{?}}
{{=partitionClause}};$blankline
0 Answers