2021SC@SDUSC
此方法用于新建表字段。
此方法只有一个参数,类型为 Array,是需要新建的字段属性。
首先使用方法 checkTableExist() 检查表是否存在,随后获取默认值。(方法 checkTableExist() 在上一篇博客中已经分析过,在此不再赘述。随后获取默认值。)
若表存在,使用sql语句新建字段即刻。若表不存在,新建一个表并添加字段。新建表时,需要查询是否默认新增‘id主键’字段,随后按照要求新建表并添加字段。
async addField(_filed) { const table_exist = await this.checkTableExist(_filed.model_id); var def; var sql; var value = _filed.value; if (value === '') { def = ''; } else if (think.isNumber(value) || think.isNumberString(value)) { def = ' DEFAULT ' + value; } else if (think.isString(value)) { def = `DEFAULT '${value}'`; } else { def = ''; } if (table_exist) { const fie = _filed; sql = `ALTER TABLE \`${this.table_name}\` ADD COLUMN \`${fie.name}\` ${fie.field} ${def} COMMENT '${fie.title}';`; sql = this.parseSql(sql); } else { const model_info = await this.model('model').where({id: _filed.model_id}).field('engine_type,need_pk').find(); if (model_info.need_pk) { const fie = _filed; sql = ` CREATE TABLE IF NOT EXISTS \`${this.table_name}\` ( \`id\` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键' , \`${fie.name}\` ${fie.field} ${def} COMMENT '${fie.title}' , PRIMARY KEY (\`id\`) ) ENGINE=${model_info.engine_type} DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci CHECKSUM=0 ROW_FORMAT=DYNAMIC DELAY_KEY_WRITE=0 ;`; sql = this.parseSql(sql); } else { const fie = _filed; sql = ` CREATE TABLE IF NOT EXISTS \`${this.table_name}\` ( \`${fie.name}\` ${fie.field} ${def} COMMENT '${fie.title}' ) ENGINE=${model_info.engine_type} DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci CHECKSUM=0 ROW_FORMAT=DYNAMIC DELAY_KEY_WRITE=0 ;`; sql = this.parseSql(sql); } } const res = await this.model('mysql').execute(sql); return res >= 0; }
此方法用于更新表字段。
此方法只有一个参数,类型为 Array,是需要更新的字段属性。
首先使用 checkTableExist() 方法检查表是否存在,若表存在,获取原字段名和默认值,使用sql语句更新字段即可。
async updateField(_field) { // 检查表是否存在 await this.checkTableExist(_field.model_id); // 获取原字段名 const last_field = await this.where({id: _field.id}).getField('name'); // 获取默认值 let def; var value = _field.value; if (value === '') { def = ''; } else if (think.isNumber(value) || think.isNumberString(value)) { def = ' DEFAULT ' + value; } else if (think.isString(value)) { def = `DEFAULT '${value}'`; } else { def = ''; } let sql = `ALTER TABLE \`${this.table_name}\` CHANGE COLUMN \`${last_field}\` \`${_field.name}\` ${_field.field} ${def} COMMENT \'${_field.title}\' ;`; sql = this.parseSql(sql); const res = await this.model('mysql').execute(sql); return res == 0; }
此方法用于删除字段。
此方法只有一个参数,类型为 Array,是需要删除的字段属性。
首先使用 checkTableExist() 方法检查表是否存在。若表存在,使用sql语句删除字段即可。
async deleteField(_field) { // 检查表是否存在 await this.checkTableExist(_field.model_id); let sql = `ALTER TABLE \`${this.table_name}\` DROP COLUMN \`${_field.name}\`;`; sql = this.parseSql(sql); // console.log(sql); const res = await this.model('mysql').execute(sql); return res == 0; }
此方法用于检查同一张表是否有相同的字段。
此方法共有三个参数,第一个参数 name 为要验证的字段名称,第二个参数 model_id 为要验证的字段的模型id。
此方法返回值为一个布尔值。若存在相同字段,返回布尔值 true;若不存在相同字段,返回布尔值 false。
async checkName(name, model_id, id) { const map = {'name': name, 'model_id': model_id}; if (!think.isEmpty(id)) { map.id = ['!=', id]; } const res = await this.where(map).find(); return think.isEmpty(res); }