2021SC@SDUSC
目录
此次继续分析文件src/model/csmwing/attribute.js
该文件中的方法主要是对表的处理。
一、addField()
此方法用于新建表字段。
此方法只有一个参数,类型为 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;
}
二、updateField()
此方法用于更新表字段。
此方法只有一个参数,类型为 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;
}
三、deleteField()
此方法用于删除字段。
此方法只有一个参数,类型为 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;
}
四、checkName()
此方法用于检查同一张表是否有相同的字段。
此方法共有三个参数,第一个参数 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);
}