絕版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

這篇文章算是充電文章吧,上篇文章許諾的表關係,在下篇文章中必定要介紹!!!微信

相關文章
相關標籤/搜索