1. 程式人生 > >node 使用 sequelize 操作資料庫不完全指北

node 使用 sequelize 操作資料庫不完全指北

開始步驟

npm init -y

安裝依賴

npm i sequelize mysql2 standard --save

連線資料庫

建立連線

新建一個 db.js

// 引入依賴
let Sequelize = require('sequelize')

// 匯出新建的連線資料庫例項,方便在其它檔案中引用
module.exports = new Sequelize('test', 'root', 'root123', {
    // 資料庫地址
    host: '192.168.5.43',
    // 使用的資料庫方言
    dialect: 'mysql'
, pool: { // 連線池中最大連線數量 max: 5, // 連線池中最小連線數量 min: 0, // 超時時間,如果10S中沒有使用,那麼釋放執行緒 idle: 10000 } })

新建例項的幾種方式

  1. 使用引數連線,本質上是:

    new Sequelize(database, [username=null], [password=null], [options={}])
    // 熟悉ES6的同學應該都知道函式的預設引數,這裡面除了 database 名是必須的以外,其它的都是使用預設引數的
    // 所以我們可以通過這個推理出下面的幾種連線方式
    1. 沒有password 和 options

      new Sequelize('database', 'username')
    2. 沒有 options

      new Sequelize('database', 'username', 'password')
    3. 沒有密碼但是有 options

      new Sequelize('database', 'username', null, {})
    4. 全部都有

      new Sequelize('database', 'username', 'password', {})
  2. 當然,還有一種特殊的連線方式,那就是直接使用連結,它的本質上是這樣的,即 options 有預設引數

    new Sequlize(URI, [options={}])
    1. 只有 URI 沒有 options

      new Sequelize('mysql://localhost:3306/database')
    2. 全有

      new Sequelize('mysql://localhost:3306/database', {})

測試連線

新建一個 testconnet.js

const conn = require('./db')

// 使用 sequlize 官方提供的 zuthenticate 來測試是否連線,使用的是 Promise 風格
conn.authenticate().then(() => console.log('connected')).catch(err => console.log(err))

操作資料庫

定義模型

手動定義模型

const Sequelize = require('sequelize')
const sequelize = require('../db')

// 先定義好對應的例項,如表名, 列名等
const User = sequelize.define('user', {
  firstName: {
    type: Sequelize.STRING,
    validate: {
        notNull: true
    }
  },
  lastName: {
    type: Sequelize.STRING,
    validate: {
        notNull: true
    }
  }
})

// 建立表,使用的是 sync 方法,該方法返回一個 Promise 物件,可以使用 then, catch 來進行後續操作
// 該方法有一個引數,那就是 force ,引數為 boolean 型,如果為 true ,那麼會刪除原表再建立,如果為 false 那麼不會刪除原表
User.sync({force: true}).then(() => console.log('SUCCESS CREATE TABLE USER')).catch(err => console.log(err))


// 刪除表
User.drop()

常用資料型別

名稱 對應資料庫
Sequelize.STRING VARCHAR(255)
Sequelize.STRING(1234) VARCHAR(1234)
Sequelize.STRING.BINARY VARCHAR BINARY
Sequelize.TEXT TEXT
Sequelize.TEXT(‘tiny’) TINYTEXT
Sequelize.INTEGER INTEGER
Sequelize.BIGINT BIGINT
Sequelize.BIGINT(11) BIGINT(11)
Sequelize.FLOAT FLOAT
Sequelize.FLOAT(11) FLOAT(11)
Sequelize.FLOAT(11, 12) FLOAT(11,12)
Sequelize.DOUBLE DOUBLE
Sequelize.DOUBLE(11) DOUBLE(11)
Sequelize.DOUBLE(11, 12) DOUBLE(11,12)
Sequelize.DECIMAL DECIMAL
Sequelize.DECIMAL(10, 2) DECIMAL(10,2)
Sequelize.DATE DATETIME
Sequelize.DATE(6) DATETIME(6)
Sequelize.DATEONLY DATE without time.
Sequelize.BOOLEAN TINYINT(1)

常用驗證

屬性 引數 詳情
is [“\^[a-z]+$”,’i’] 只允許字母
is /\^[a-z]+$/i 與上一個示例相同,使用了真正的正則表示式
not [“[a-z]”,’i’] 不允許字母
isEmail true 檢查郵件格式 ([email protected])
isIP true 檢查IPv4(129.89.23.1)或IPv6格式
isIPv4 true 檢查IPv4(129.89.23.1)格式
isIPv6 true 檢查IPv6格式
isAlpha true 只允許字母
isAlphanumeric true 只允許使用字母數字
isNumeric true 只允許數字
isInt true 檢查是否為有效整數
isFloat true 檢查是否為有效浮點數
isDecimal true 檢查是否為任意數字
isLowercase true 檢查是否為小寫
isUppercase true 檢查是否為大寫
notNull true 不允許為空
isNull true 只允許為空
notEmpty true 不允許空字串
equals ‘specificvalue’ 只允許一個特定值
contains ‘foo’ 檢查是否包含特定的子字串
notIn [[‘foo’,’bar’]] 檢查是否值不是其中之一
isIn [[‘foo’,’bar’]] 檢查是否值是其中之一
notContains ‘bar’ 不允許包含特定的子字串
len [2,10] 只允許長度在2到10之間的值
isUUID 4 只允許uuids
isDate true 只允許日期字串
isAfter “2011-11-05” 只允許在特定日期之後的日期字串
isBefore “2011-11-05” 只允許在特定日期之前的日期字串
max 23 只允許值<=23
min 23 只允許值>=23
isCreditCard true 檢查有效的信用卡號碼

當然也可以寫自定義驗證規則

isEven(value) {
    if (parseInt(value) % 2 != 0) {
      throw new Error('Only even values are allowed!')
      // 我們也在模型的上下文中,所以如果它存在的話, 
      // this.otherField會得到otherField的值。
    }
}

自動生成模型

當然很多情況下,資料庫中已經事先定義好了表,那麼我們再一個個的重複寫著 modle 那就沒有一點意義,這個時候我們就需要通過 sequelize-auto 來自動生成對應模型

安裝依賴

npm i sequelize-auto -g

然後在對應的專案下使用命令生成modle

sequelize-auto -h localhost -d test -u root -x root123 -p 3306

常用引數解釋

引數 含義
-h mysql 服務地址
-d 操作的資料庫
-x 密碼
-u 使用者名稱
-p 介面
-t 要生成的表,如果不填的話,那麼生成全部表
-T 不要生成的表

使用

const Sequelize = require('sequelize')
const sequelize = require('../db')
const user = require('./users')

// 然後就可以這麼使用了,這樣的話就與我們之前自己建立的表操作漢典有任何區別
let User = user(sequelize,Sequelize)
User.sync()

module.exports = User

使用模型

增加

依舊使用上面建立的 User 表為例

const conn = require('./db')
const User = require('./hand-module/user')

User.create({
    firstName: 'Hello',
    lastName: 'World'
})

User.create({
    firstName: 'Hello',
    lastName: 'JavaScript'
})

刪除

const conn = require('./db')
const User = require('./hand-module/user')

User.destroy({where: {lastName: 'World'}})

修改

const conn = require('./db')
const User = require('./hand-module/user')

User.update({firstName: 'LOVE'},{where: {firstName: 'Hello'}})

查詢

User.findOne({where: {lastName: 'JavaScript'}}).then(data => {
  console.log(data.dataValues)
})
User.findAll({where: {firstName: 'LOVE'}}).then(data=>{
    for(let i in data){
        console.log(data[i].dataValues)
    }
})

當然還有好多其它方法,這裡只介紹了最簡單的幾個增刪改查了