node 使用 sequelize 操作資料庫不完全指北
阿新 • • 發佈:2019-01-06
開始步驟
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
}
})
新建例項的幾種方式
使用引數連線,本質上是:
new Sequelize(database, [username=null], [password=null], [options={}]) // 熟悉ES6的同學應該都知道函式的預設引數,這裡面除了 database 名是必須的以外,其它的都是使用預設引數的
沒有password 和 options
new Sequelize('database', 'username')
沒有 options
new Sequelize('database', 'username', 'password')
沒有密碼但是有 options
new Sequelize('database', 'username', null, {})
全部都有
new Sequelize('database', 'username', 'password', {})
當然,還有一種特殊的連線方式,那就是直接使用連結,它的本質上是這樣的,即 options 有預設引數
new Sequlize(URI, [options={}])
只有 URI 沒有 options
new Sequelize('mysql://localhost:3306/database')
全有
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)
}
})