以下文檔摘要自sequelize中文文檔
數(shù)據(jù)庫連接
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: /* 選擇 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */
});
表創(chuàng)建連接
sequelize中沒有表的概念逝慧,這里更多是說modal,故我們的項目一般分為modal、service逼泣、controller三層诅病。
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');
const User = sequelize.define('User', {
// 在這里定義模型屬性
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING
// allowNull 默認(rèn)為 true
}
}, {
// 這是其他模型參數(shù)
});
模型同步這里需要了解一下,通過User.sync()
來做对扶。
數(shù)據(jù)庫操作語句
這里需要提的是sequelize的所有操作都是基于modal實例上來進(jìn)行的袁辈,實例通過User.build
來進(jìn)行創(chuàng)建菜谣,保存通過實例的save
方法進(jìn)行。
常用語句如下
- insert: User.create(創(chuàng)建對象)
- delete: User.drop(條件語句)
- update: User.update(修改對象晚缩,條件語句)
- select: User.findAll()
select
查詢這里的語法和特殊點較多,語法有:
- findAll
- findOne
- findByPk
- findOrCreate
- findAndCountAll
特殊點有
- 表字段處理
- where
- order by
- limit媳危、offset
- group by
表字段處理
User.findAll({
attributes: [
'foo', // 特定字段查詢
['bar', 'baz'], // 將字段bar重命名為baz
[sequelize.fn('COUNT', sequelize.col('hats')), 'n_hats'] // 聚合count
]
})
where
const { Op } = require("sequelize");
Post.findAll({
where: {
[Op.and]: [{ a: 5 }, { b: 6 }], // (a = 5) AND (b = 6)
[Op.or]: [{ a: 5 }, { b: 6 }], // (a = 5) OR (b = 6)
someAttribute: {
// 基本
[Op.eq]: 3, // = 3
[Op.ne]: 20, // != 20
[Op.is]: null, // IS NULL
[Op.not]: true, // IS NOT TRUE
[Op.or]: [5, 6], // (someAttribute = 5) OR (someAttribute = 6)
// 使用方言特定的列標(biāo)識符 (以下示例中使用 PG):
[Op.col]: 'user.organization_id', // = "user"."organization_id"
// 數(shù)字比較
[Op.gt]: 6, // > 6
[Op.gte]: 6, // >= 6
[Op.lt]: 10, // < 10
[Op.lte]: 10, // <= 10
[Op.between]: [6, 10], // BETWEEN 6 AND 10
[Op.notBetween]: [11, 15], // NOT BETWEEN 11 AND 15
// 其它操作符
[Op.all]: sequelize.literal('SELECT 1'), // > ALL (SELECT 1)
[Op.in]: [1, 2], // IN [1, 2]
[Op.notIn]: [1, 2], // NOT IN [1, 2]
[Op.like]: '%hat', // LIKE '%hat'
[Op.notLike]: '%hat', // NOT LIKE '%hat'
[Op.startsWith]: 'hat', // LIKE 'hat%'
[Op.endsWith]: 'hat', // LIKE '%hat'
[Op.substring]: 'hat', // LIKE '%hat%'
[Op.iLike]: '%hat', // ILIKE '%hat' (不區(qū)分大小寫) (僅 PG)
[Op.notILike]: '%hat', // NOT ILIKE '%hat' (僅 PG)
[Op.regexp]: '^[h|a|t]', // REGEXP/~ '^[h|a|t]' (僅 MySQL/PG)
[Op.notRegexp]: '^[h|a|t]', // NOT REGEXP/!~ '^[h|a|t]' (僅 MySQL/PG)
[Op.iRegexp]: '^[h|a|t]', // ~* '^[h|a|t]' (僅 PG)
[Op.notIRegexp]: '^[h|a|t]', // !~* '^[h|a|t]' (僅 PG)
[Op.any]: [2, 3], // ANY ARRAY[2, 3]::INTEGER (僅 PG)
// 在 Postgres 中, Op.like/Op.iLike/Op.notLike 可以結(jié)合 Op.any 使用:
[Op.like]: { [Op.any]: ['cat', 'hat'] } // LIKE ANY ARRAY['cat', 'hat']
// 還有更多的僅限 postgres 的范圍運(yùn)算符,請參見下文
}
}
});
order by
Foo.findOne({
order: [
// 將返回 `name`
['name'],
// 將返回 `username` DESC
['username', 'DESC'],
// 將返回 max(`age`)
sequelize.fn('max', sequelize.col('age')),
// 將返回 max(`age`) DESC
[sequelize.fn('max', sequelize.col('age')), 'DESC'],
// 將返回 otherfunction(`col1`, 12, 'lalala') DESC
[sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],
// 將返回 otherfunction(awesomefunction(`col`)) DESC, 這種嵌套可能是無限的!
[sequelize.fn('otherfunction', sequelize.fn('awesomefunction', sequelize.col('col'))), 'DESC']
]
});
limit荞彼、offset
Project.findAll({ offset: 5, limit: 5 });
group by
Project.findAll({ group: 'name' });
連表查詢
建立表關(guān)系語法:hasOne、hasMany待笑、belongsTo鸣皂、belongsToMany
建立后,可以通過get${指定鍵}獲取暮蹂,參考關(guān)聯(lián)
延遲獲取
const awesomeCaptain = await Captain.findOne({
where: {
name: "Jack Sparrow"
}
});
// 用獲取到的 captain 做點什么
console.log('Name:', awesomeCaptain.name);
console.log('Skill Level:', awesomeCaptain.skillLevel);
// 現(xiàn)在我們需要有關(guān)他的 ship 的信息!
const hisShip = await awesomeCaptain.getShip();
// 用 ship 做點什么
console.log('Ship Name:', hisShip.name);
console.log('Amount of Sails:', hisShip.amountOfSails);
預(yù)先加載
const awesomeCaptain = await Captain.findOne({
where: {
name: "Jack Sparrow"
},
include: Ship
});
// 現(xiàn)在 ship 跟著一起來了
console.log('Name:', awesomeCaptain.name);
console.log('Skill Level:', awesomeCaptain.skillLevel);
console.log('Ship Name:', awesomeCaptain.ship.name);
console.log('Amount of Sails:', awesomeCaptain.ship.amountOfSails);