在Node全栈之路(一),也就是上篇文章中,我们讲到了sequlize的基本增删该查,这篇文章,我们在上篇文章的基础上继续探讨,讲一下关于sequlize创建的表之间的对应关系

参考资料:https://itbilu.com/nodejs/npm/VkYIaRPz-.html#induction-promise

本人联系方式:微信:jkxx123321


在这里,对上一篇文章做一下补充,当我们用sequlize.define(),定义表结构的时候,有时会遇到一些字段,你如说年龄字段,年龄不能为负数吧,比如说摸一个字段不能为空或者只能为字母或者输入长度不能超过50,这些问题都不是问题,我们在定义表结构的时候,可以设置一些属性,对其经行约束。

说白了,也就是他的内部机制有一个validate对象,可以设置它,从而达到限定某一个字段的属性,(如果你学过Asp.net MVC 这个功能和EF的特性标签很相似)

如上所示,列的定义可以是字符串、一个预定义的Sequelize构造函数、或是一个对象。在定义列时,我们可以指定数据类型,也可以指定默认值、主键/外键等约束,还可以自定义访问器(getter)和设置器(setter)。

 //创建表 定义表结构
const User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING,
validate:{
is:["[a-z]",'i'],//只允许数字
},
allowNull:false,//非空验证
defaultValue:'郭',//给该列设置默认值
unique:false,//设置为true的时候,会为该列添加一个unique唯一约束
primaryKey:false,//指定该列是不是主键
field:firstName,//设置数据库中的字段名字,设置后sequlize会自动映射到数据库中,一般情况下默认即可,不用设置
autoincrement:false,//是否为自增
references:{
model:{
//指定从表
},
key:id,//该列表示到外键列的引用
},
onDelete:'NO ACTION',//当被引用的外键更新时
onUpdate:'NO ACTION',//当被引用的外键被删除时候
},
lastName: {
type: Sequelize.STRING
}
},
{
omitNull:true,//是否忽略空值
timestamps:true,//两个时间戳字段 createdAt updatedAt
paranoid:true,//逻辑删除,当调用destroy的,不会删除,而是多出一列,叫做deletedAt,将其设置为true,从而表示删除真实项目中,我们没有真删除,都是逻辑删除
freezeTableName:treu,//如果不将freezeTableName设置为true的话,那么数据库表明和模型实体类名不一致
createdAt:false,
updatedAt:false,//设置成false后,将不会在数据库表中生成默认列
initialAutoIncrement:'id',
hooks:{
//钩子函数,主要是在某些事件发生的前或后,或者某些生命周期某些事件发生的前后调用触发
afterDelete:()=>{
console.log('==========================');
console.log('删除完成后触发执行');
console.log('=========================='); },
},
validate:{
//模型广泛验证对象,一般不用吧....
}
});
定义表结构时,设置的一些属性,大家可以做参考
 名称     类型     说明
modelName String 模型名,在sequelize.models属性中会使用这个名称;如果没有在options中指定表名,数据库中也会使用此属性做为表名。
attributes Object 一个对象,其每个属性对应表中的一个列,每个列可以使用一个预定义的DataType、字符串或类型描述对象定义:
attributes.column String | DataType | Object 数据库中的列描述
attributes.column.type String | DataType DataType或字符串,表示列的数据类型
[attributes.column
.allowNull=true] Boolean 设置为false时,会给添加NOT NULL(非空)约束,数据保存时会进行非空验证
[attributes.column
.defaultValue=null] Any 字面默认值, JavaScript函数, 或一个 SQL 函数 (查看 sequelize.fn)
[attributes.column
.unique=false] String | Boolean 设置为true时,会为列添加唯一约束
[attributes.column
.primaryKey=false] Boolean 指定是否是主键
[attributes.column
.field=null] String 设置在数据库中的字段名。设置后会,Sequelize会将属性名映射到数据库中的不同名称
[attributes.column
.autoIncrement=false] Boolean 是否自增
[attributes.column
.comment=null] String 字段描述(自1.7+后,此描述不再添加到数据库中)
[attributes.column
.references=null] String | Model 引用对象
[attributes.column
.references.model] String | Model 如果列引用到另一个表,可以通过这个属性设置模型或字符串。
[attributes.column
.references.key='id'] String 该列表示到表外键列的引用
[attributes.column.onUpdate] String 当被引用的键更新时的操作,可选值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一
[attributes.column.onDelete] String 当被引用的键删除时的操作,可选值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一
[attributes.column.get] Function 为列自定义一个访问器。使用this.getDataValue(String)时调用的值
[attributes.column.set] Function 为列自定义一个设置器。使用this.setDataValue(String, Value)时调用的值
[attributes.validate] Object 模型每次保存时调用的验证对象。可是validator.js中的验证函数(参见 DAOValidator)、或自定义的验证函数。
[options] Object 提供给Sequelize 构造函数的一些默认值
[options.defaultScope={}] Object 定义使用此模型的默认搜索范围。作用范围与提供给 find / findAll 的选项形式相同
[options.scopes] Object 更多范围,定义 defaultScope 的定义形式相同。关于限制范围的定义请参考Model.scope
[options.omitNull] Boolean 是否忽略空值,这意味着,所有列的空值将不会被保存
[options.timestamps=true] Boolean 为模型添加 createdAt 和 updatedAt 两个时间戳字段
[options.paranoid=false] Boolean 使用逻辑删除。设置为true后,调用 destroy 方法时将不会删队模型,而是设置一个 deletedAt 列。此设置需要 timestamps=true
[options.underscored=false] Boolean 转换列名的驼峰命名规则为下划线命令规则
[options.underscoredAll=false] Boolean 转换模型名的驼峰命名规则为表名的下划线命令规则
[options.freezeTableName=false] Boolean 设置为true时,sequelize不会改变表名,否则可能会按其规则有所调整
[options.name] Object 允有singular 和 plural两个属性的对象,在模型与其它模型关联时使用
[options.name.singular=
inflection.singularize(modelName)] String
[options.name.plural=
inflection.pluralize(modelName)] String
[options.indexes] Array.<Object> 要建立的索引
[options.indexes[].name] String 索引名,默认为模型名 + '_' + 字段名
[options.indexes[].type] String 索引类型,仅用于 mysql,其值为:UNIQUE、 FULLTEXT 或 SPATIAL之一
[options.indexes[].method] String 创建索引的方法(SQL中的USING 声明)。BTREE 或 HASH 可以在 mysql 和 postgres中支持,postgres中支持,还支持 GIST 和 GIN
[options.indexes[].unique=false] Boolean 设置索引是否唯一,设置后会自动触发UNIQUE设置
[options.indexes[]
.concurrently=false] Boolean PostgreSQL 中在创建索引时不使用任务写锁定。仅 Postgres 适用
[options.indexes[].fields] Array.<String | Object> 建立索引的字段数组。每个字段可以是一个字段名,sequelize 对象 (如 sequelize.fn),
或一个包含:attribute (字段名)、length (创建前缀字符数)、order (列排序方向)、collate (较验的字段集合 (排序))
[options.createdAt] String | Boolean 如果为字符串,则使用提供的值代替 createdAt 列的默认名,设置为flase则不添加这个字段。
[options.updatedAt] String | Boolean 如果为字符串,则使用提供的值代替 updatedAt 列的默认名,设置为flase则不添加这个字段
[options.deletedAt] String | Boolean 如果为字符串,则使用提供的值代替 deletedAt 列的默认名,设置为flase则不添加这个字段
[options.tableName] String 模型所对应表的表名,设置freezeTableName 为 true时,才会严格使用模型名
[options.getterMethods] Object 提供给 getter 调用的方法,与每列定义的访问器一样。如果为列定义了一个相同名称的 getter 方法,那么会通过这个方法获取值;如果未定义的名称与列不匹配,这将做为一个虚拟访问器;也用于设置多个值,但不能用在。
[options.setterMethods] Object 提供给 setter 调用的方法,与每列定义的设置器一样。如果为列定义了一个相同名称的 setter 方法,那么会通过这个方法设置值;如果未定义的名称与列不匹配,这将做为一个虚拟访设置;也用于匹配多个值,但不用于逻辑删除。
[options.instanceMethods] Object 提供给每个实例(DAO)的方法。如果通过sequelize对方法进行了重写,可以通过"this.constructor.super_.prototype"来调用原方法,如:this.constructor.super_.prototype.toJSON.apply(this, arguments)
[options.classMethods] Object 添加到Model的类方法,如果通过sequelize对方法进行了重写,可以通过 this.constructor.prototype来调用原方法,如:this.constructor.prototype.find.apply(this, arguments)
[options.schema='public'] String
[options.engine] String
[options.charset] String
[options.comment] String
[options.collate] String
[options.initialAutoIncrement] String MySQL中设置 AUTO_INCREMENT (自增)的初始值
[options.hooks] Object 一个包含钩子函数的对象,这些函数会在生生命周期内某些事件发生之前或之后被调用。可添加的钩子函数有:beforeValidate, afterValidate, beforeBulkCreate, beforeBulkDestroy, beforeBulkUpdate, beforeCreate, beforeDestroy, beforeUpdate, afterCreate, afterDestroy, afterUpdate, afterBulkCreate, afterBulkDestory 和 afterBulkUpdate。每个属性可以是一个函数,或是一个包含一组函数的数组。
[options.validate] Object 模型广泛验证对象。该验证会通过this。如果验证函数中有参数,则会被认为是异步的,并通过一个包含可选错误的回调函数形式的的调。
 名称     类型     说明
modelName String 模型名,在sequelize.models属性中会使用这个名称;如果没有在options中指定表名,数据库中也会使用此属性做为表名。
attributes Object 一个对象,其每个属性对应表中的一个列,每个列可以使用一个预定义的DataType、字符串或类型描述对象定义:
attributes.column String | DataType | Object 数据库中的列描述
attributes.column.type String | DataType DataType或字符串,表示列的数据类型
[attributes.column
.allowNull=true] Boolean 设置为false时,会给添加NOT NULL(非空)约束,数据保存时会进行非空验证
[attributes.column
.defaultValue=null] Any 字面默认值, JavaScript函数, 或一个 SQL 函数 (查看 sequelize.fn)
[attributes.column
.unique=false] String | Boolean 设置为true时,会为列添加唯一约束
[attributes.column
.primaryKey=false] Boolean 指定是否是主键
[attributes.column
.field=null] String 设置在数据库中的字段名。设置后会,Sequelize会将属性名映射到数据库中的不同名称
[attributes.column
.autoIncrement=false] Boolean 是否自增
[attributes.column
.comment=null] String 字段描述(自1.+后,此描述不再添加到数据库中)
[attributes.column
.references=null] String | Model 引用对象
[attributes.column
.references.model] String | Model 如果列引用到另一个表,可以通过这个属性设置模型或字符串。
[attributes.column
.references.key='id'] String 该列表示到表外键列的引用
[attributes.column.onUpdate] String 当被引用的键更新时的操作,可选值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一
[attributes.column.onDelete] String 当被引用的键删除时的操作,可选值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一
[attributes.column.get] Function 为列自定义一个访问器。使用this.getDataValue(String)时调用的值
[attributes.column.set] Function 为列自定义一个设置器。使用this.setDataValue(String, Value)时调用的值
[attributes.validate] Object 模型每次保存时调用的验证对象。可是validator.js中的验证函数(参见 DAOValidator)、或自定义的验证函数。
[options] Object 提供给Sequelize 构造函数的一些默认值
[options.defaultScope={}] Object 定义使用此模型的默认搜索范围。作用范围与提供给 find / findAll 的选项形式相同
[options.scopes] Object 更多范围,定义 defaultScope 的定义形式相同。关于限制范围的定义请参考Model.scope
[options.omitNull] Boolean 是否忽略空值,这意味着,所有列的空值将不会被保存
[options.timestamps=true] Boolean 为模型添加 createdAt 和 updatedAt 两个时间戳字段
[options.paranoid=false] Boolean 使用逻辑删除。设置为true后,调用 destroy 方法时将不会删队模型,而是设置一个 deletedAt 列。此设置需要 timestamps=true
[options.underscored=false] Boolean 转换列名的驼峰命名规则为下划线命令规则
[options.underscoredAll=false] Boolean 转换模型名的驼峰命名规则为表名的下划线命令规则
[options.freezeTableName=false] Boolean 设置为true时,sequelize不会改变表名,否则可能会按其规则有所调整
[options.name] Object 允有singular 和 plural两个属性的对象,在模型与其它模型关联时使用
[options.name.singular=
inflection.singularize(modelName)] String
[options.name.plural=
inflection.pluralize(modelName)] String
[options.indexes] Array.<Object> 要建立的索引
[options.indexes[].name] String 索引名,默认为模型名 + '_' + 字段名
[options.indexes[].type] String 索引类型,仅用于 mysql,其值为:UNIQUE、 FULLTEXT 或 SPATIAL之一
[options.indexes[].method] String 创建索引的方法(SQL中的USING 声明)。BTREE 或 HASH 可以在 mysql 和 postgres中支持,postgres中支持,还支持 GIST 和 GIN
[options.indexes[].unique=false] Boolean 设置索引是否唯一,设置后会自动触发UNIQUE设置
[options.indexes[]
.concurrently=false] Boolean PostgreSQL 中在创建索引时不使用任务写锁定。仅 Postgres 适用
[options.indexes[].fields] Array.<String | Object> 建立索引的字段数组。每个字段可以是一个字段名,sequelize 对象 (如 sequelize.fn),
或一个包含:attribute (字段名)、length (创建前缀字符数)、order (列排序方向)、collate (较验的字段集合 (排序))
[options.createdAt] String | Boolean 如果为字符串,则使用提供的值代替 createdAt 列的默认名,设置为flase则不添加这个字段。
[options.updatedAt] String | Boolean 如果为字符串,则使用提供的值代替 updatedAt 列的默认名,设置为flase则不添加这个字段
[options.deletedAt] String | Boolean 如果为字符串,则使用提供的值代替 deletedAt 列的默认名,设置为flase则不添加这个字段
[options.tableName] String 模型所对应表的表名,设置freezeTableName 为 true时,才会严格使用模型名
[options.getterMethods] Object 提供给 getter 调用的方法,与每列定义的访问器一样。如果为列定义了一个相同名称的 getter 方法,那么会通过这个方法获取值;如果未定义的名称与列不匹配,这将做为一个虚拟访问器;也用于设置多个值,但不能用在。
[options.setterMethods] Object 提供给 setter 调用的方法,与每列定义的设置器一样。如果为列定义了一个相同名称的 setter 方法,那么会通过这个方法设置值;如果未定义的名称与列不匹配,这将做为一个虚拟访设置;也用于匹配多个值,但不用于逻辑删除。
[options.instanceMethods] Object 提供给每个实例(DAO)的方法。如果通过sequelize对方法进行了重写,可以通过"this.constructor.super_.prototype"来调用原方法,如:this.constructor.super_.prototype.toJSON.apply(this, arguments)
[options.classMethods] Object 添加到Model的类方法,如果通过sequelize对方法进行了重写,可以通过 this.constructor.prototype来调用原方法,如:this.constructor.prototype.find.apply(this, arguments)
[options.schema='public'] String
[options.engine] String
[options.charset] String
[options.comment] String
[options.collate] String
[options.initialAutoIncrement] String MySQL中设置 AUTO_INCREMENT (自增)的初始值
[options.hooks] Object 一个包含钩子函数的对象,这些函数会在生生命周期内某些事件发生之前或之后被调用。可添加的钩子函数有:beforeValidate, afterValidate, beforeBulkCreate, beforeBulkDestroy, beforeBulkUpdate, beforeCreate, beforeDestroy, beforeUpdate, afterCreate, afterDestroy, afterUpdate, afterBulkCreate, afterBulkDestory 和 afterBulkUpdate。每个属性可以是一个函数,或是一个包含一组函数的数组。
[options.validate] Object 模型广泛验证对象。该验证会通过this。如果验证函数中有参数,则会被认为是异步的,并通过一个包含可选错误的回调函

接下来说一下模型导入,大家可以想一下,我们一个项目中,如果只用一个数据库,但一个数据库中有好多张表,为了方便管理,我们最好将一个模型放一个js文件,独立编写,这样也方便分工合作,之后,可以把大家写的独立的model 合到我们的index.js文件,这里就需要模型导入了。

在这里补充点小知识

这篇文章算是充电文章吧,上篇文章许诺的表关系,在下篇文章中一定要介绍!!!

绝版Node--Sequlize搭建服务(Node全栈之路 二)的更多相关文章

  1. 绝版Node--Sequlize搭建服务(Node全栈之路)

    绝版Node--Sequlize搭建服务(Node全栈之路) 参考资料:https://itbilu.com/nodejs/npm/VkYIaRPz-.html 准备环境:Mysql,Node 前沿: ...

  2. C蛮的全栈之路-node篇(二) 实战一:自动发博客

    目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...

  3. C蛮的全栈之路-node篇(一) 环境布置

    目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...

  4. C蛮的全栈之路-序章 技术栈选择与全栈工程师

    目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 博主背景 985院校毕业,至今十年C++开发工作经验, ...

  5. python 全栈之路

    目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块 4. Python - 面对对象 5. Python - 文 ...

  6. Python全栈之路目录结构

    基础 1.Python全栈之路-----基础篇 2.Python全栈之路---运算符与基本的数据结构 3.Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数 4.Python全栈 ...

  7. Python全栈之路----目录

    Module1 Python基本语法 Python全栈之路----编程基本情况介绍 Python全栈之路----常用数据类型--集合 Module2 数据类型.字符编码.文件操作 Python全栈之路 ...

  8. Python全栈之路----常用模块----hashlib加密模块

    加密算法介绍 HASH       Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...

  9. Node.js 中开源库探秘 object-assign | 全栈之路

    这篇内容呢,讲的是另一个技术栈 Node.js 系列,虽然和咱们这里的主题不是特别吻合,不过嘛,汲取多样性的养分是快速成长的好方法,也是现在流行的全栈工程师的必经之路. 由于这篇内容涉及的是 Node ...

随机推荐

  1. 安装eclipse启动时报错

    1.在安装eclipse后,点击exe文件时,提示出现错误,记录在log文件中,因为log文件就是日志文件,可以方便我们排查错误,打开log文件,可以看到文件记录了每次出错的时间和错误栈信息,最新一次 ...

  2. 关于一点儿对仓储(Repository)的理解

    仓储(Repository) 内容来源于dudu的 关于Repository模式一文 Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的 ...

  3. wnmp(windows+nginx+mysql+php)环境搭建和配置

    要求 必备知识 熟悉基本编程环境搭建. 运行环境 windows 7(64位); nginx-1.4.7;MySQL Server 5.5php-5.4.39-nts 下载地址 环境下载 Nginx是 ...

  4. Vue + Element UI 实现权限管理系统 前端篇(三):工具模块封装

    封装 axios 模块 封装背景 使用axios发起一个请求是比较简单的事情,但是axios没有进行封装复用,项目越来越大,会引起越来越多的代码冗余,让代码变得越来越难维护.所以我们在这里先对 axi ...

  5. WebMagic实现分布式抓取以及断点抓取

    访问我的博客 前言 从去年到今年,笔者主要负责的是与合作方的内容对接,新增的合作商不是很多的情况下,在我自从去年引入了 WebMagic 这个爬虫框架之后,基本很少需要去关注维护爬虫,做的最多的是新接 ...

  6. Nginx配置资源下载目录

    访问我的博客 之前在网上找 CentOs 的镜像的时候,发现了阿里云的这个镜像源,速度蛮快的.今天也来搭建一个类似的站,使用 nginx 作为资源下载服务器. 图片详情: 安装 Nginx 参考这篇教 ...

  7. Spring学习之路-从入门到放弃

    后台框架是真难入门啊!!!IDE的使用,环境的搭建,框架下载,上手,每一步都恶心人. 花了整整两天,才学会用idea,并且初步了解了maven(TM就是一个npm),然后跟着下载了对应的jar包,搭建 ...

  8. MVC用非Entity Framework将数据显示于视图

    学习此篇之前,先看看<DataTable数据显示于MVC应用程序>http://www.cnblogs.com/insus/p/3361182.html 那是将DataTable显示于MV ...

  9. 深入理解.NET MemoryCache

    摘要 MemoryCache是.Net Framework 4.0开始提供的内存缓存类,使用该类型可以方便的在程序内部缓存数据并对于数据的有效性进行方便的管理,借助该类型可以实现ASP.NET中常用的 ...

  10. mahout 使用

    最近在做mahout源码调用的时候,发现一个参数:startPhase和endPhase,这两个参数是什么意思呢?比如运行RecommenderJob时,可以看到10个MR任务,所以猜测是否是一个ph ...