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

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

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

本人联系方式:微信:jkxx123321mysql


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

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

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

 1 //建立表 定义表结构
 2 const User = sequelize.define('user', {
 3   firstName: {
 4     type: Sequelize.STRING,
 5     validate:{
 6       is:["[a-z]",'i'],//只容许数字
 7     },
 8     allowNull:false,//非空验证
 9     defaultValue:'郭',//给该列设置默认值
10     unique:false,//设置为true的时候,会为该列添加一个unique惟一约束
11     primaryKey:false,//指定该列是否是主键
12     field:firstName,//设置数据库中的字段名字,设置后sequlize会自动映射到数据库中,通常状况下默认便可,不用设置
13     autoincrement:false,//是否为自增 
14     references:{
15       model:{
16         //指定从表
17       },
18       key:id,//该列表示到外键列的引用
19     },
20     onDelete:'NO ACTION',//当被引用的外键更新时
21     onUpdate:'NO ACTION',//当被引用的外键被删除时候
22   },
23   lastName: {
24     type: Sequelize.STRING
25   }
26 },
27 {
28   omitNull:true,//是否忽略空值
29   timestamps:true,//两个时间戳字段 createdAt updatedAt
30   paranoid:true,//逻辑删除,当调用destroy的,不会删除,而是多出一列,叫作deletedAt,将其设置为true,从而表示删除真实项目中,咱们没有真删除,都是逻辑删除
31   freezeTableName:treu,//若是不将freezeTableName设置为true的话,那么数据库代表和模型实体类名不一致
32   createdAt:false,
33   updatedAt:false,//设置成false后,将不会在数据库表中生成默认列
34   initialAutoIncrement:'id',
35   hooks:{
36     //钩子函数,主要是在某些事件发生的前或后,或者某些生命周期某些事件发生的先后调用触发
37     afterDelete:()=>{
38       console.log('==========================');
39       console.log('删除完成后触发执行');
40       console.log('==========================');
41       
42     },
43   },
44   validate:{
45     //模型普遍验证对象,通常不用吧....
46   }
47 });

 

定义表结构时,设置的一些属性,你们能够作参考
 1 名称     类型     说明
 2 modelName     String     模型名,在sequelize.models属性中会使用这个名称;若是没有在options中指定表名,数据库中也会使用此属性作为表名。
 3 attributes     Object     一个对象,其每一个属性对应表中的一个列,每一个列可使用一个预约义的DataType、字符串或类型描述对象定义:
 4 attributes.column     String | DataType | Object     数据库中的列描述
 5 attributes.column.type     String | DataType     DataType或字符串,表示列的数据类型
 6 [attributes.column
 7 .allowNull=true]     Boolean     设置为false时,会给添加NOT NULL(非空)约束,数据保存时会进行非空验证
 8 [attributes.column
 9 .defaultValue=null]     Any     字面默认值, JavaScript函数, 或一个 SQL 函数 (查看 sequelize.fn)
10 [attributes.column
11 .unique=false]     String | Boolean     设置为true时,会为列添加惟一约束
12 [attributes.column
13 .primaryKey=false]     Boolean     指定是不是主键
14 [attributes.column
15 .field=null]     String     设置在数据库中的字段名。设置后会,Sequelize会将属性名映射到数据库中的不一样名称
16 [attributes.column
17 .autoIncrement=false]     Boolean     是否自增
18 [attributes.column
19 .comment=null]     String     字段描述(自1.7+后,此描述再也不添加到数据库中)
20 [attributes.column
21 .references=null]     String | Model     引用对象
22 [attributes.column
23 .references.model]     String | Model     若是列引用到另外一个表,能够经过这个属性设置模型或字符串。
24 [attributes.column
25 .references.key='id']     String     该列表示到表外键列的引用
26 [attributes.column.onUpdate]     String     当被引用的键更新时的操做,可选值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一
27 [attributes.column.onDelete]     String     当被引用的键删除时的操做,可选值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一
28 [attributes.column.get]     Function     为列自定义一个访问器。使用this.getDataValue(String)时调用的值
29 [attributes.column.set]     Function     为列自定义一个设置器。使用this.setDataValue(String, Value)时调用的值
30 [attributes.validate]     Object     模型每次保存时调用的验证对象。但是validator.js中的验证函数(参见 DAOValidator)、或自定义的验证函数。
31 [options]     Object     提供给Sequelize 构造函数的一些默认值
32 [options.defaultScope={}]     Object     定义使用此模型的默认搜索范围。做用范围与提供给 find / findAll 的选项形式相同
33 [options.scopes]     Object     更多范围,定义 defaultScope 的定义形式相同。关于限制范围的定义请参考Model.scope
34 [options.omitNull]     Boolean     是否忽略空值,这意味着,全部列的空值将不会被保存
35 [options.timestamps=true]     Boolean     为模型添加 createdAt 和 updatedAt 两个时间戳字段
36 [options.paranoid=false]     Boolean     使用逻辑删除。设置为true后,调用 destroy 方法时将不会删队模型,而是设置一个 deletedAt 列。此设置须要 timestamps=true
37 [options.underscored=false]     Boolean     转换列名的驼峰命名规则为下划线命令规则
38 [options.underscoredAll=false]     Boolean     转换模型名的驼峰命名规则为表名的下划线命令规则
39 [options.freezeTableName=false]     Boolean     设置为true时,sequelize不会改变表名,不然可能会按其规则有所调整
40 [options.name]     Object     允有singular 和 plural两个属性的对象,在模型与其它模型关联时使用
41 [options.name.singular=
42 inflection.singularize(modelName)]     String     
43 [options.name.plural=
44 inflection.pluralize(modelName)]     String     
45 [options.indexes]     Array.<Object>     要创建的索引
46 [options.indexes[].name]     String     索引名,默认为模型名 + '_' + 字段名
47 [options.indexes[].type]     String     索引类型,仅用于 mysql,其值为:UNIQUE、 FULLTEXT 或 SPATIAL之一
48 [options.indexes[].method]     String     建立索引的方法(SQL中的USING 声明)。BTREE 或 HASH 能够在 mysql 和 postgres中支持,postgres中支持,还支持 GIST 和 GIN
49 [options.indexes[].unique=false]     Boolean     设置索引是否惟一,设置后会自动触发UNIQUE设置
50 [options.indexes[]
51 .concurrently=false]     Boolean     PostgreSQL 中在建立索引时不使用任务写锁定。仅 Postgres 适用
52 [options.indexes[].fields]     Array.<String | Object>     创建索引的字段数组。每一个字段能够是一个字段名,sequelize 对象 (如 sequelize.fn),
53 或一个包含:attribute (字段名)、length (建立前缀字符数)、order (列排序方向)、collate (较验的字段集合 (排序))
54 [options.createdAt]     String | Boolean     若是为字符串,则使用提供的值代替 createdAt 列的默认名,设置为flase则不添加这个字段。
55 [options.updatedAt]     String | Boolean     若是为字符串,则使用提供的值代替 updatedAt 列的默认名,设置为flase则不添加这个字段
56 [options.deletedAt]     String | Boolean     若是为字符串,则使用提供的值代替 deletedAt 列的默认名,设置为flase则不添加这个字段
57 [options.tableName]     String     模型所对应表的表名,设置freezeTableName 为 true时,才会严格使用模型名
58 [options.getterMethods]     Object     提供给 getter 调用的方法,与每列定义的访问器同样。若是为列定义了一个相同名称的 getter 方法,那么会经过这个方法获取值;若是未定义的名称与列不匹配,这将作为一个虚拟访问器;也用于设置多个值,但不能用在。
59 [options.setterMethods]     Object     提供给 setter 调用的方法,与每列定义的设置器同样。若是为列定义了一个相同名称的 setter 方法,那么会经过这个方法设置值;若是未定义的名称与列不匹配,这将作为一个虚拟访设置;也用于匹配多个值,但不用于逻辑删除。
60 [options.instanceMethods]     Object     提供给每一个实例(DAO)的方法。若是经过sequelize对方法进行了重写,能够经过"this.constructor.super_.prototype"来调用原方法,如:this.constructor.super_.prototype.toJSON.apply(this, arguments)
61 [options.classMethods]     Object     添加到Model的类方法,若是经过sequelize对方法进行了重写,能够经过 this.constructor.prototype来调用原方法,如:this.constructor.prototype.find.apply(this, arguments)
62 [options.schema='public']     String     
63 [options.engine]     String     
64 [options.charset]     String     
65 [options.comment]     String     
66 [options.collate]     String     
67 [options.initialAutoIncrement]     String     MySQL中设置 AUTO_INCREMENT (自增)的初始值
68 [options.hooks]     Object     一个包含钩子函数的对象,这些函数会在生生命周期内某些事件发生以前或以后被调用。可添加的钩子函数有:beforeValidate, afterValidate, beforeBulkCreate, beforeBulkDestroy, beforeBulkUpdate, beforeCreate, beforeDestroy, beforeUpdate, afterCreate, afterDestroy, afterUpdate, afterBulkCreate, afterBulkDestory 和 afterBulkUpdate。每一个属性能够是一个函数,或是一个包含一组函数的数组。
69 [options.validate]     Object     模型普遍验证对象。该验证会经过this。若是验证函数中有参数,则会被认为是异步的,并经过一个包含可选错误的回调函数形式的的调。

 

 1 名称     类型     说明
 2 modelName     String     模型名,在sequelize.models属性中会使用这个名称;若是没有在options中指定表名,数据库中也会使用此属性作为表名。
 3 attributes     Object     一个对象,其每一个属性对应表中的一个列,每一个列可使用一个预约义的DataType、字符串或类型描述对象定义:
 4 attributes.column     String | DataType | Object     数据库中的列描述
 5 attributes.column.type     String | DataType     DataType或字符串,表示列的数据类型
 6 [attributes.column
 7 .allowNull=true]     Boolean     设置为false时,会给添加NOT NULL(非空)约束,数据保存时会进行非空验证
 8 [attributes.column
 9 .defaultValue=null]     Any     字面默认值, JavaScript函数, 或一个 SQL 函数 (查看 sequelize.fn)
10 [attributes.column
11 .unique=false]     String | Boolean     设置为true时,会为列添加惟一约束
12 [attributes.column
13 .primaryKey=false]     Boolean     指定是不是主键
14 [attributes.column
15 .field=null]     String     设置在数据库中的字段名。设置后会,Sequelize会将属性名映射到数据库中的不一样名称
16 [attributes.column
17 .autoIncrement=false]     Boolean     是否自增
18 [attributes.column
19 .comment=null]     String     字段描述(自1.7+后,此描述再也不添加到数据库中)
20 [attributes.column
21 .references=null]     String | Model     引用对象
22 [attributes.column
23 .references.model]     String | Model     若是列引用到另外一个表,能够经过这个属性设置模型或字符串。
24 [attributes.column
25 .references.key='id']     String     该列表示到表外键列的引用
26 [attributes.column.onUpdate]     String     当被引用的键更新时的操做,可选值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一
27 [attributes.column.onDelete]     String     当被引用的键删除时的操做,可选值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一
28 [attributes.column.get]     Function     为列自定义一个访问器。使用this.getDataValue(String)时调用的值
29 [attributes.column.set]     Function     为列自定义一个设置器。使用this.setDataValue(String, Value)时调用的值
30 [attributes.validate]     Object     模型每次保存时调用的验证对象。但是validator.js中的验证函数(参见 DAOValidator)、或自定义的验证函数。
31 [options]     Object     提供给Sequelize 构造函数的一些默认值
32 [options.defaultScope={}]     Object     定义使用此模型的默认搜索范围。做用范围与提供给 find / findAll 的选项形式相同
33 [options.scopes]     Object     更多范围,定义 defaultScope 的定义形式相同。关于限制范围的定义请参考Model.scope
34 [options.omitNull]     Boolean     是否忽略空值,这意味着,全部列的空值将不会被保存
35 [options.timestamps=true]     Boolean     为模型添加 createdAt 和 updatedAt 两个时间戳字段
36 [options.paranoid=false]     Boolean     使用逻辑删除。设置为true后,调用 destroy 方法时将不会删队模型,而是设置一个 deletedAt 列。此设置须要 timestamps=true
37 [options.underscored=false]     Boolean     转换列名的驼峰命名规则为下划线命令规则
38 [options.underscoredAll=false]     Boolean     转换模型名的驼峰命名规则为表名的下划线命令规则
39 [options.freezeTableName=false]     Boolean     设置为true时,sequelize不会改变表名,不然可能会按其规则有所调整
40 [options.name]     Object     允有singular 和 plural两个属性的对象,在模型与其它模型关联时使用
41 [options.name.singular=
42 inflection.singularize(modelName)]     String     
43 [options.name.plural=
44 inflection.pluralize(modelName)]     String     
45 [options.indexes]     Array.<Object>     要创建的索引
46 [options.indexes[].name]     String     索引名,默认为模型名 + '_' + 字段名
47 [options.indexes[].type]     String     索引类型,仅用于 mysql,其值为:UNIQUE、 FULLTEXT 或 SPATIAL之一
48 [options.indexes[].method]     String     建立索引的方法(SQL中的USING 声明)。BTREE 或 HASH 能够在 mysql 和 postgres中支持,postgres中支持,还支持 GIST 和 GIN
49 [options.indexes[].unique=false]     Boolean     设置索引是否惟一,设置后会自动触发UNIQUE设置
50 [options.indexes[]
51 .concurrently=false]     Boolean     PostgreSQL 中在建立索引时不使用任务写锁定。仅 Postgres 适用
52 [options.indexes[].fields]     Array.<String | Object>     创建索引的字段数组。每一个字段能够是一个字段名,sequelize 对象 (如 sequelize.fn),
53 或一个包含:attribute (字段名)、length (建立前缀字符数)、order (列排序方向)、collate (较验的字段集合 (排序))
54 [options.createdAt]     String | Boolean     若是为字符串,则使用提供的值代替 createdAt 列的默认名,设置为flase则不添加这个字段。
55 [options.updatedAt]     String | Boolean     若是为字符串,则使用提供的值代替 updatedAt 列的默认名,设置为flase则不添加这个字段
56 [options.deletedAt]     String | Boolean     若是为字符串,则使用提供的值代替 deletedAt 列的默认名,设置为flase则不添加这个字段
57 [options.tableName]     String     模型所对应表的表名,设置freezeTableName 为 true时,才会严格使用模型名
58 [options.getterMethods]     Object     提供给 getter 调用的方法,与每列定义的访问器同样。若是为列定义了一个相同名称的 getter 方法,那么会经过这个方法获取值;若是未定义的名称与列不匹配,这将作为一个虚拟访问器;也用于设置多个值,但不能用在。
59 [options.setterMethods]     Object     提供给 setter 调用的方法,与每列定义的设置器同样。若是为列定义了一个相同名称的 setter 方法,那么会经过这个方法设置值;若是未定义的名称与列不匹配,这将作为一个虚拟访设置;也用于匹配多个值,但不用于逻辑删除。
60 [options.instanceMethods]     Object     提供给每一个实例(DAO)的方法。若是经过sequelize对方法进行了重写,能够经过"this.constructor.super_.prototype"来调用原方法,如:this.constructor.super_.prototype.toJSON.apply(this, arguments)
61 [options.classMethods]     Object     添加到Model的类方法,若是经过sequelize对方法进行了重写,能够经过 this.constructor.prototype来调用原方法,如:this.constructor.prototype.find.apply(this, arguments)
62 [options.schema='public']     String     
63 [options.engine]     String     
64 [options.charset]     String     
65 [options.comment]     String     
66 [options.collate]     String     
67 [options.initialAutoIncrement]     String     MySQL中设置 AUTO_INCREMENT (自增)的初始值
68 [options.hooks]     Object     一个包含钩子函数的对象,这些函数会在生生命周期内某些事件发生以前或以后被调用。可添加的钩子函数有:beforeValidate, afterValidate, beforeBulkCreate, beforeBulkDestroy, beforeBulkUpdate, beforeCreate, beforeDestroy, beforeUpdate, afterCreate, afterDestroy, afterUpdate, afterBulkCreate, afterBulkDestory 和 afterBulkUpdate。每一个属性能够是一个函数,或是一个包含一组函数的数组。
69 [options.validate]     Object     模型普遍验证对象。该验证会经过this。若是验证函数中有参数,则会被认为是异步的,并经过一个包含可选错误的回调函

接下来讲一下模型导入,你们能够想一下,咱们一个项目中,若是只用一个数据库,但一个数据库中有好多张表,为了方便管理,咱们最好将一个模型放一个js文件,独立编写,这样也方便分工合做,以后,能够把你们写的独立的model 合到咱们的index.js文件,这里就须要模型导入了。数组

 

 在这里补充点小知识promise

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

相关文章
相关标签/搜索