如何使Doris建表语句支持除主键模型的其他数据模型?

Viewed 5
  1. 打开项目设置

    image.png

  2. 将字段的拓展属性启用

    image.png

  3. 给拓展属性设置码值

    具体码值参考如下:

[
  {
    "label": "DUPLICATE",
    "value": "DUPLICATE"
  },
  {
    "label": "AGGREGATE",
    "value": "AGGREGATE"
  },
  {
    "label": "UNIQUE",
    "value": "UNIQUE"
  }
]

image.png

  1. 打开物理模型,找到对应的字段,选择相应的数据模型

    image.png

  2. 修改建表语句的代码模板

    具体模板内容参考如下:

{{
    let schemaName = it.schemaName ? `${it.schemaName}.` : '';
    const tableKey = `${schemaName}${it.defKey}`;

    function getDataType(field) {
        const { dbDataType } = field;
        if(!dbDataType) {
            return ''
        }
        const dataType = dbDataType.toUpperCase();
        if (dataType === 'VARCHAR') {
            return `${dataType}(${field.dataLen ? field.dataLen : 128})`;
        } else if (['JSON','DATE'].includes(dataType)) {
            return dataType;
        }  else if (dataType === 'TIMESTAMP') {
            return field.dataLen && field.dataLen >= 0 && field.dataLen <= 9 ?  `${dataType}(${field.dataLen})` : dataType;
        } else if (dataType === 'DECIMAL') {
            return field.dataLen && field.dataLen >= 0 && field.dataLen <= 6  ? `${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' : '';
        const defaultValue = field.defaultValue ? ` DEFAULT ${field.defaultValue}` : '';
        const comment = ` COMMENT '${it.func.strJoin(field.defName, field.intro, ";", true)}'`;
        return `${dataType}${notNull}${defaultValue}${comment}${index < nonPkList.length-1 ? ',' :  ''}`;
    }
}}
DROP TABLE IF EXISTS {{= tableKey }};

CREATE TABLE {{= tableKey }}(
{{ pkList = [] ; nonPkList = [] ;duList = [] ; agList = []; }}
{{~it.fields:field:index}}{{? field.primaryKey }}{{ pkList.push(field) }}{{?? field.attr1 === 'DUPLICATE'}}{{ nonPkList.push(field);duList.push(field) }}{{?? field.attr1 === 'AGGREGATE'}}{{ nonPkList.push(field);agList.push(field) }}{{??}}{{ nonPkList.push(field) }}{{?}}{{~}}
{{~pkList:field:index}}
    `{{=field.defKey}}` {{= getFieldDefinition(field, index, it.fields) }}{{?}}
{{~nonPkList:field:index}}
    `{{=field.defKey}}` {{= getFieldDefinition(field, index, it.fields) }}{{?}}
{{~}}
){{? pkList.length > 0 }} UNIQUE KEY ({{~pkList:field:index}}`{{= field.defKey }}`{{= index < pkList.length-1 ? ',' : '' }}{{~}}){{?}}
{{? duList.length > 0 }} DUPLICATE KEY ({{~duList:field:index}}`{{= field.defKey }}`{{= index < duList.length-1 ? ',' : '' }}{{~}}){{?}}
{{? agList.length > 0 }} AGGREGATE KEY ({{~agList:field:index}}`{{= field.defKey }}`{{= index < agList.length-1 ? ',' : '' }}{{~}}){{?}}
{{? it.defName || it.intro }} 
    COMMENT '{{=it.func.strJoin(it.defName, it.intro, ";", true)}}' 
{{?}}
    DISTRIBUTED BY HASH(`{{=pkList.length > 0 ? pkList[0].defKey : it.fields[0].defKey}}`) BUCKETS 1
    PROPERTIES(
    "replication_allocation" = "tag.location.default: 1"
    );
$blankline

image.png

image.png

0 Answers
Related Questions