sequelize -- Model的详细定义

本文详细介绍了Sequelize中Model的定义,包括字段属性设置如type、allowNull、autoIncrement等,自定义get/set方法用于数据处理,以及数据验证机制。在创建、更新和保存操作时,Sequelize会自动进行数据检查。此外,还提到了通过配置文件导入Model的方式。
var Sequelize = require('sequelize');
var sequelize  = new Sequelize('dataBaseName', 'user', 'password', 
dialect: 'mysql',
pool: {
 max: 10,
 min: 0
}
);
var mdl = sequelize.define('modelName', 
{
    name : {
        // ...
    }
    // 字段属性设置
},
{
// model设置
});

字段属性设置

预先需要明确的是, 属性是对 数据库表中某个字段的属性 进行申明.

(如上代码)
也就是说 ,赋给name的属性对象或者属性, 是告诉 sequelize: 数据库中某个字段的属性.

而sequelize中,name是作为该属性的别名( xxx as name),name值是 某个字段的属性.

如果没有在属性中申明 对应于name的字段名(用field申明),那么name会默认是数据库中的字段名(即name既是字段名也是别名).


相应字段有:
type 字段数据类型(sequlize. …)
allowNull(是否允许为空true,false)
autoIncrement(自增, true ,false)
unique(唯一性, true,false, string)
comment (解释 说明)

primaryKey (对主键的设置, true,false)
defaultValue(默认值的设置)
field


  • unique

unique 的设置 可以为 boolean值 也可以是 字符串

sequelize.define('modelname', 
{
    firstName : {
      type: sequelize.STRING,
      unique: 'name'
    },
    lastName: {
      type: sequelize.STRING,
      unique: 'name'
    }
},
{
// model option
});

// 如上, unique为字符串, 效果是  firstName和lastName 的复合 要唯一
// 因此,unique为字符串时, 意味着将 具有相同字符串的字段复合, 规定整体的唯一性


  • field

用来表明 数据库中 相应的字段名称.
// ... 限于篇幅,其他代码省略
firstName : {
      type: sequelize.STRING,
      field: 'zhulihenpiaoliang'
}
// 在获取firstName时,相当于申明  select firstName as zhulihenpiaoliang  ...
// 如果不申明field, firstName 既是字段名也是 别名

自定义get\set

情境: 对数据库中获取到的字段,有时候需要经过加工处理.
比如:时间的格式, 数据库中可能是 yyyy-MM-dd hh:mm:ss , 但是你想要这种yyyy-MM-dd.


  • 对单个字段进行加工

如上所述,对时间字段的加工,就是对单个字段的加工.
var Employee = sequelize.define('employee', {
  name:  {
    type     : Sequelize.STRING,
    allowNull: false,
    get      : function()  {
      var title = this.getDataValue('title');
      // sequelize在___get或者set方法中___,可以通过this可以获取或者设置 model实例 的属性;非get或者set方法中,可不行哦(试过)
      return this.getDataValue('name') + ' (' + title + ')';
    },
  },
  title: {
    type     : Sequelize.STRING,
    allowNull: false,
    set      : function(val) {
      this.setDataValue('title', val.toUpperCase());
    }
  }
});

Employee
  .create({ name: 'John Doe', title: 'senior engineer' })
  .then(function(employee) {
    console.log(employee.get('name')); // John Doe (SENIOR ENGINEER)
    console.log(employee.get('title')); // SENIOR ENGINEER
  })

*对多个属性进行加工

当想对数据库中定义的firstName和lastName属性)进行合并时,这时就会想要加工多个属性了

var Foo = sequelize.define('foo', {
  firstname: Sequelize.STRING,
  lastname: Sequelize.STRING
}, {
// 注意:这里将set和get换为 setterMethods和getterMethods.
// 定义的地方也从fieldOption转到modelOption
  getterMethods   : {
    fullName       : function()  { return this.firstname + ' ' + this.lastname 
    }
  },

  setterMethods   : {
    fullName       : function(value) {
        var names = value.split(' ');

        this.setDataValue('firstname', names.slice(0, -1).join(' '));
        this.setDataValue('lastname', names.slice(-1).join(' '));
    },
  }
});

我觉得要注意的点:
sequelize在get或者set方法中,可以通过this可以获取或者设置 model实例 的属性;非get或者set方法中,可不行哦(试过)
不直接获取,也有利于防止无意间修改实例底层设置.

对数据进行检查

var Employee = sequelize.define('employee', {
  name:  {
    type     : Sequelize.STRING,
    allowNull: false,
    validate: {
        isArray: true,            // only allow arrays
    }
  },
  date: {
      type: seqeulize.DATE,
      validate: {
        isDate: true,
        isAfter: "2011-11-05",
        isBefore: "2011-11-30"
      }
  }
});

sequelize会在create, update 和 save操作时,会自动调用.
需要注意:

  1. 如果验证需要输入多个参数, 那么数组的形式赋值.
  2. 如果参数本身就是数组,那么需要在参数外 再套一层 数组.
  3. 如果参数allwNull为true, 当值为null时, validotr不会运行
// 示例
var Employee = sequelize.define('employee', {
  name:  {
    type     : Sequelize.STRING,
    allowNull: false,
    validate: {
    // 多个参数
        len: [2,10],       // 只允许name长度在2和10之间
    }
  },
  type: {
      type: seqeulize.DATE,
      validate: {
      // 参数是数组
        isIn: [['foo', 'bar']],   // 只允许值是foo或者bar
      }
  },
  school: {
      type: seqeulize.DATE,
      allowNull: true,
      validate: {
      // 当school为null时,此验证不会运行
        isIn: [['foo', 'bar']]
      }
  }
});

官方建议:

  1. 尽量使用对象,如: isIn: { args: [[‘foo’, ‘bar’]]}
  2. 尽量使用自定义错误信息,而不是validator提供的信息. 如: isIn: { args: [[‘foo’, ‘bar’]], msg: ‘数据不属于规定类型’}

使用配置文件(import)

// 使用文件
var Project = sequelize.import(__dirname + "/path/to/models/project")

// 配置文件,地址/path/to/models/project.js
module.exports = function(sequelize, DataTypes) {
// sequelize会传入一个sequelize对象和存储数据类型的对象
  return sequelize.define("project", {
    name: DataTypes.STRING,
    description: DataTypes.TEXT
  })
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值