玩轉Node.js-Sequelize基礎
Sequelize是什麼?
Sequelize 是一個基於 promise 的 Node.js ORM, 目前支援 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有強大的事務支援, 關聯關係, 預讀和延遲載入,讀取複製等功能。
Sequelize 遵從 語義版本控制。 支援 Node v10 及更高版本以便使用 ES6 功能。
說簡單點sequelize就是幫助我們操作資料庫的一個ORM(Object–relational mapping,物件關係對映)框架,我們使用mysql2操作資料庫,要使用各種原生的sql語句去操作,功能簡單還好說,功能複雜龐大就會顯得很麻煩,繁瑣,畢竟要寫大量的原生sql語句,sequelize的出現幫助我們只需要通過物件的方式就可以完成資料庫表建立、設計、資料的CRUD操作,簡化開發、提高效率。
中文文件:https://www.sequelize.com.cn/
安裝
Sequelize 的使用可以通過 npm (或 yarn).
npm install --save sequelize
你還必須手動為所選資料庫安裝驅動程式:
# 選擇以下之一: $ npm install --save pg pg-hstore # Postgres $ npm install --save mysql2 $ npm install --save mariadb $ npm install --save sqlite3 $ npm install --save tedious # Microsoft SQL Server
因為我們要操作的是mysql,所以這個地方我們選擇mysql2。
連線到資料庫
const Sequelize = require('sequelize'); // 建立Sequelize的例項物件並配置連線資訊 const sequelize = new Sequelize({ host: '127.0.0.1', username: 'root', password: 'root', database: 'todos', dialect: 'mysql', timezone: 'Asia/Shanghai' //當我們向資料庫中寫入時間的時候,預設會根據系統當前所在時區進行設定 }) // 測試連線 sequelize.authenticate().then(_=>{ console.log("資料庫連線成功!"); }).catch(err=>{ console.log("資料庫連線失敗! ", err); })
new Sequelize options:
host:主機,預設localhost
port:埠,預設3306
dialect:資料庫型別,預設mysql,必填
timezone:時區,影響資料庫日期時間格式的值,格式:+08:00 或 字串格式
什麼是模型?
用來表述(描述)資料庫表字段資訊的物件,每一個模型物件表示資料庫中的一個表,後續對資料庫的操作都是通過對應的模型物件來完成的。
模型物件
建立模型物件
public define(modelName: String, attributes: Object, options: Object): Model
- modelName:模型名稱,自定義
- attributes:模型中包含的資料,每一個數據對映對應表中的每一個欄位
- options:模型(表)的設定
/**
* 資料庫連線完成以後,需要確定操作的表
* 使用ORM,不需要通過sql來操作表,而是通過物件來操作
* 給每一個要操作的表定義一個物件 - 模型 Model
*/
const UserModel = sequelize.define('User', {
// 描述表中對應的欄位資訊
// 物件的key預設對應這表的column欄位
id: {
// 每一個欄位的資訊
type: Sequelize.INTEGER(10), // 整數型別
allowNull: false, // 不允許為空
primaryKey: true, // 設定為主鍵
autoIncrement: true // 允許自增
},
username: {
type: Sequelize.STRING(255),
allowNull: false,
defaultValue: 0
},
age: {
type: Sequelize.TINYINT,
allowNull: false,
defaultValue: 0
},
gender: {
type: Sequelize.ENUM(['男', '女', '預設']), // 注意列舉型別為陣列
allowNull: false,
defaultValue: '男'
}
}, {
// 用來設定欄位以外的其他資訊
timestamps: false,
paranoid: false,
freezeTableName: true,
tableName: 'user',
indexes: [{
name: 'uname',
fields: ['username']
}, {
name: 'age',
fields: ['age']
}]
})
attributes 設定
attributes是一個物件,裡面包含了對應的表中的欄位資訊,key表示欄位名稱,值是欄位的具體描述。
欄位值描述
type: 欄位型別,String|DataTypes
allowNull: 是否允許為空,預設為true
defaultValue: 預設值,預設為null
unique: 值唯一,預設為false
primaryKey: 是否為主鍵,預設為false
field: 資料庫中欄位的實際名稱
autoIncrement: 是否自增,預設false
get: 欄位的getter,函式
set: 欄位的setter,函式
validate: 物件,對當前欄位值發生改變的時候進行驗證
模型額外配置
timestamps:是否給每條記錄新增 createdAt 和 updatedAt 欄位,並在新增新資料和更新資料的時候自動設定這兩個欄位的值,預設為true
paranoid:設定 deletedAt 欄位,當刪除一條記錄的時候,並不是真的銷燬記錄,而是通過該欄位來標識,即保留資料,進行假刪除,預設為false
freezeTableName:禁用修改表名; 預設情況下,sequelize將自動將所有傳遞的模型名稱(define的第一個引數)轉換為複數。 預設為false
tableName:手動設定表的實際名稱
定義表的索引
indexes:Array