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操作时,会自动调用.
需要注意:
- 如果验证需要输入多个参数, 那么数组的形式赋值.
- 如果参数本身就是数组,那么需要在参数外 再套一层 数组.
- 如果参数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']]
}
}
});
官方建议:
- 尽量使用对象,如: isIn: { args: [[‘foo’, ‘bar’]]}
- 尽量使用自定义错误信息,而不是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
})
}
本文详细介绍了Sequelize中Model的定义,包括字段属性设置如type、allowNull、autoIncrement等,自定义get/set方法用于数据处理,以及数据验证机制。在创建、更新和保存操作时,Sequelize会自动进行数据检查。此外,还提到了通过配置文件导入Model的方式。

932

被折叠的 条评论
为什么被折叠?



