Egg.js,是阿里開(kāi)源的企業(yè)級(jí) Node.js 框架寄纵。相比Express鳖敷、Koa,Egg.js更為輕量程拭,是Koa的增強(qiáng)定踱,開(kāi)發(fā)成本和效率也更為高效。
Sequelize恃鞋,是一個(gè)廣泛使用的 ORM 框架崖媚,它支持 MySQL、PostgreSQL恤浪、SQLite 和 MSSQL 等多個(gè)數(shù)據(jù)源至扰。
一、安裝配置插件
打開(kāi)vscode終端安裝egg-mysql资锰,mysql2
npm install --save egg-sequelize mysql2
在 config/plugin.js 中引入 egg-sequelize 插件
exports.sequelize = {
enable: true,
package: 'egg-sequelize',
}
在 config/config.default.js 中編寫(xiě) sequelize 配置
config.sequelize = {
dialect: 'mysql',
host: '123.45.67.890',
port: 3306,
database: 'test',
username: 'root',
password: '123456',
// 配置數(shù)據(jù)庫(kù)時(shí)間為東八區(qū)北京時(shí)間
timezone: '+08:00',
define: { // model的全局配置
timestamps: true, // 添加create,update,delete時(shí)間戳
paranoid: true, // 添加軟刪除
freezeTableName: true, // 防止修改表名為復(fù)數(shù)
underscored: false // 防止駝峰式字段被默認(rèn)轉(zhuǎn)為下劃線
},
// 打印日志
logging: true,
// 時(shí)間格式化
dialectOptions: {
dateStrings: true,
typeCast: true
}
};
注意點(diǎn)
1、日期顯示格式異常
默認(rèn)情況下查詢(xún)的日期是這種樣子2022-01-02T09:14:03.102Z
阶祭,我們需要對(duì)它自動(dòng)格式化才行绷杜。
dialectOptions: {
dateStrings: true,
typeCast: true
}
這樣就會(huì)格式化成醬紫:2022-01-04 10:39:56
二、模型配置
模型是 Sequelize 的本質(zhì). 模型是代表數(shù)據(jù)庫(kù)中表的抽象. 在 Sequelize 中濒募,它是一個(gè) Model 的擴(kuò)展類(lèi)鞭盟。
Sequelize 中的模型有一個(gè)名稱(chēng),此名稱(chēng)不必與它在數(shù)據(jù)庫(kù)中表示的表的名稱(chēng)相同瑰剃。 通常齿诉,模型具有單數(shù)名稱(chēng)(例如,User)晌姚,而表具有復(fù)數(shù)名稱(chēng)(例如粤剧,Users),這是完全可配置的挥唠。
我們先在model文件夾中創(chuàng)建一個(gè)parents.js文件定義parents模型:
'use strict';
/**
* 家長(zhǎng)表
*/
module.exports = app => {
const { STRING, INTEGER, UUID, NOW, DATE, UUIDV4 } = app.Sequelize;
const Parents = app.model.define('Parents', {
id: {
type: UUID,
primaryKey: true,
allowNull: false,
defaultValue: UUIDV4,
comment: '家長(zhǎng)id'
},
name: {
type: STRING(36),
allowNull: false,
comment: '家長(zhǎng)姓名'
},
age: {
type: INTEGER,
allowNull: false,
comment: '家長(zhǎng)年齡'
},
createDate: {
type: DATE,
defaultValue: NOW,
field: 'create_date',
comment: '創(chuàng)建時(shí)間'
},
updateDate: {
type: DATE,
defaultValue: NOW,
field: 'update_date',
comment: '更新時(shí)間'
}
}, {
// 去除createAt抵恋,updateAt
timestamps: false,
// 實(shí)例對(duì)應(yīng)的表名
tableName: 'parents'
});
return Parents;
};
是否修改表名為復(fù)數(shù)配置
Squelize會(huì)將Parents默認(rèn)轉(zhuǎn)變?yōu)閺?fù)數(shù),也就是直接加s變?yōu)镻arentss宝磨,很多時(shí)候這并不是我們想要的弧关,可以對(duì)其進(jìn)行修改盅安。
1、在config.json文件中世囊,添加如下配置
這是全局的别瞭,避免在每個(gè)模型中修設(shè)置。
"define": {
"freezeTableName": true
}
2株憾、對(duì)app.model.define的第三個(gè)參數(shù)進(jìn)行配置
項(xiàng)目已經(jīng)在config.json配置了蝙寨,模型中已被注釋掉。此外号胚,我們可以在第三個(gè)參數(shù)中配置我們想要的表名tableName
添加默認(rèn)值
在更新或添加數(shù)據(jù)的時(shí)候籽慢,默認(rèn)值是有必要的。一般對(duì)id猫胁,創(chuàng)建時(shí)間(create_date)箱亿,更新時(shí)間(updated_date)設(shè)置默認(rèn)值。
id: {
defaultValue: UUIDV4
},
create_date: {
defaultValue: NOW
},
update_date: {
defaultValue: NOW
}
三弃秆、模型字段的數(shù)據(jù)類(lèi)型
這里只展示部分?jǐn)?shù)據(jù)類(lèi)型届惋,詳細(xì)的請(qǐng)查閱文檔。
1菠赚、字符串(String)
DataTypes.STRING // VARCHAR(255)
DataTypes.STRING(36) // VARCHAR(36)
DataTypes.TEXT // TEXT
2脑豹、布爾(Boolean)
DataTypes.BOOLEAN // TINYINT(1)
3、數(shù)字(Number)
DataTypes.INTEGER // INTEGER
DataTypes.BIGINT(11) // BIGINT(11)
DataTypes.FLOAT // FLOAT
DataTypes.FLOAT(11) // FLOAT(11)
4衡查、日期
DataTypes.DATE // DATETIME 適用于 mysql/sqlite
5瘩欺、UUID
Sequelize 使用 Sequelize.UUIDV1 或 Sequelize.UUIDV4 生成UUID作為主鍵。
{
type: DataTypes.UUID,
defaultValue: Sequelize.UUIDV4 // 或 Sequelize.UUIDV1
}
四拌牲、數(shù)據(jù)查詢(xún)
1俱饿、新增
單個(gè)新增
const parents = await Parents.create({
name: '王大錘'
});
parents實(shí)體的其他字段設(shè)置了默認(rèn)值,會(huì)返回新增數(shù)據(jù)的實(shí)體塌忽。
批量新增
const parents = await Parents.bulkCreate({
name: '王大錘'
}, {
name: '山呱呱'
});
2拍埠、查詢(xún)
const result = await this.ctx.model.Parents.findAll({
limit: 10, // 當(dāng)頁(yè)條數(shù)
offset: 0, // 開(kāi)始下標(biāo)
order: [['create_date', 'desc']], // 排序規(guī)則
where: {
age: {
[Op.gt]: 36
},
name: {
[Op.like]: '王%'
}
},
attributes: [ // 指定返回的屬性
'id',
'name',
// 第一個(gè)參數(shù)為屬性,第二個(gè)參數(shù)為別名土居,返回?cái)?shù)據(jù)以別名返回
['create_date', 'createDate']
]
});
操作符
Sequelize提供了多種運(yùn)算符枣购,常見(jiàn)的都寫(xiě)在例子里了,其他的請(qǐng)查閱文檔擦耀。
const result = await this.ctx.model.Parents.findAll({
where: {
age: {
// [Op.gt]: 36,
// [Op.eq]: 39, // = 39
// [Op.ne]: 39 // != 39
// [Op.gt]: 32 // > 32
// [Op.gte]: 32 // >= 32
// [Op.lt]: 32 // < 32
// [Op.lte]: 32 // <= 32
// [Op.between]: [32, 35], // BETWEEN 32 AND 35
// [Op.notBetween]: [32, 35], // NOT BETWEEN 32 AND 35
// [Op.in]: [36, 38], // IN [36, 38]
// [Op.notIn]: [36, 38], // NOT IN [36, 38]
// 組合
// [Op.or]: {
// [Op.lt]: 36,
// [Op.eq]: 60
// }
},
// Op.in簡(jiǎn)寫(xiě)
// age: [32, 39], 同使用 `age: { [Op.in]: [32, 39] }`
name: {
// [Op.like]: '王%',
// [Op.like]: '%hat', // LIKE '%hat'
// [Op.notLike]: '%hat', // NOT LIKE '%hat'
// [Op.startsWith]: 'hat', // LIKE 'hat%'
// [Op.endsWith]: 'hat', // LIKE '%hat'
},
// Op.not實(shí)例
// [Op.not]: [{
// age: [36,37,38]
// }, {
// name: {
// [Op.like]: '王%'
// }
// }],
create_date: {
[Op.lt]: new Date(),
[Op.gt]: new Date(new Date() - 24 * 60 * 60 * 1000)
}
}
});
3棉圈、更新
const effectedNum = await this.ctx.model.Parents.update({
name: '王小錘'
}, {
where: {
id: '123456789'
}
})
4、刪除
const effectedNum = await this.ctx.model.Parents.destroy({
where: '123456789'
})
5眷蜓、count
count 方法僅計(jì)算數(shù)據(jù)庫(kù)中元素出現(xiàn)的次數(shù)迄损。
const effectedNum = await this.ctx.model.Parents.count({
where: {
age: {
[Op.gt]: 25
}
}
})
6、max, min 和 sum
await this.ctx.model.Parents.max('age'); // 63
await this.ctx.model.Parents.max('age', {
where: {
age: {[Op.lt]: 40}
}
}); // 39
await this.ctx.model.Parents.sum('age'); // 1027
7账磺、模型查找
這種查詢(xún)方式效率會(huì)高很多芹敌。
findByPk
findByPk 方法使用提供的主鍵從表中僅獲得一個(gè)條目痊远。
await this.ctx.model.Parents.findByPk('12');
findOne
findOne 方法獲得它找到的第一個(gè)條目(它可以滿(mǎn)足提供的可選查詢(xún)參數(shù))。
await Project.findOne({ where: { age: 40 } });
findAndCountAll
在處理與分頁(yè)有關(guān)的查詢(xún)時(shí)非常有用氏捞。
const { count, rows } = await this.ctx.model.Parents.findAndCountAll({
where: {
name: {
[Op.like]: '王%'
}
},
offset: 10,
limit: 0
});
console.log(count);
console.log(rows);
最后
歡迎關(guān)注我的公眾號(hào)【前端技術(shù)驛站】碧聪,多多交流,共同進(jìn)步液茎!
回復(fù) 100
獲取100本圖靈圖書(shū)
回復(fù)react
逞姿,vue
,node
獲取最新實(shí)戰(zhàn)視頻