在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
這篇文章算是充電文章吧,上篇文章許諾的表關係,在下篇文章中必定要介紹!!!微信