egg.js中的ORM
ORM是與數據庫的交互的框架,使用起來非常的方便,在django中我也是最常用ORM來操作數據庫
在egg框架中,常用的是sequelize來進行操作數據庫的
導入對應的第三方庫
因爲我們使用的是sequelize來操作orm的,所以需要把這個庫給導進項目中。
npm i egg-sequelize --save
因爲egg-sequelize需要依賴mysql2,所以也要把mysql2也導進去
npm i mysql2 --save
因爲這次的舉例是mssql,也就是操作sql server數據庫,所以也要導入mssql
npm i mssql egg-mssql --save
配置orm
在config/plugin.js
exports.sequelize = {
enable: true,
package: 'egg-sequelize',
}
在config/config.default.js
config.sequelize = {
dialect: 'mssql',//數據庫類型
host: '127.0.0.1',//鏈接地址
port: 1433,//端口
database: 'customer',//數據庫名稱
username: 'xiaoming',//用戶名
password: '123456',//密碼
define: {
underscored: false,
//使用自定義表名
freezeTableName: true,
//去掉默認的添加時間和更新時間
timestamps: false,
},
dialectOptions: {
options: { "requestTimeout": 300000 }//超時時間
},
timezone: '+08:00',//時區
}
因爲這次主要是用sql server數據庫,所以這個配置也是按照mssql來配置的,如果想用mysql來配置,可以按照官網來配置
https://eggjs.org/zh-cn/tutorials/sequelize.html
配置交互的數據表
首先我們要先新建一個model的文件夾,在app文件夾下面
然後在model裏面新建一個customer.js的文件
//在這裏設計數據表,也可以通過這裏來操作數據表
module.exports = function (app) {
const {STRING,INTEGER, DECIMAL} = app.Sequelize
//首先設計客戶表
const Customer = app.model.define('cu',{
Id:{
type:INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull:true,
comment:"id",
},
company_name:{
type:STRING,
comment:'company_name',
allowNull: false,
},
customer_name:{
type:STRING,
comment:'customer_name',
allowNull: false,
},
customer_address:{
type:STRING,
comment:'customer_address',
allowNull: false,
},
customer_type:{
type:STRING,
allowNull: false,
comment:'customer_type',
},
delete_sign:{
type:STRING,
allowNull: false,
defaultValue:'1',
comment:'delete_sign'
}
},{
//使用自定義表名
freezeTableName: true,
//去掉默認的添加時間和更新時間
timestamps: false,
})
// 建立外鍵
Customer.associate = function () {
app.model.Customer.hasMany(app.model.Contacts, {
as: 'contacts',
foreignKey: 'cu_id',
targetKey: 'Id',
})
}
return Customer;
}
const {STRING,INTEGER, DECIMAL} = app.Sequelize
首先說一下 const {STRING,INTEGER, DECIMAL} = app.Sequelize 這個的作用
STRING,INTEGER, DECIMAL 是orm的數據類型,都是Sequelize對象裏面的。
還有下面這些數據類型都是orm中的數據類型
2.1 STRING() - 變長字符串
2.2 CHAR() - 定長字符串
2.3 TEXT() - 指定爲文本列
2.4 INTEGER() - 整型
2.5 BIGINT() - 長整型
2.6 FLOAT() - 浮點數
2.7 REAL() - 浮點數
2.8 DOUBLE() - 雙精度浮點數
2.9 DECIMAL() - 小數
2.10 BOOLEAN() - 布爾
2.11 TIME() - 時間類型
2.12 DATE() - 日期時間類型
2.13 DATEONLY() - 日期類型
2.14 HSTORE() - 鍵/值類型
2.15 JSON() - JSON字符串類型
2.16 JSONB() - JSONB類型
2.17 NOW() - 時間默認值
2.18 BLOB() - 二進制類型
2.19 RANGE() - Range類型
2.20 UUID() - UUID類型
2.21 UUIDV1() - UUID v1 默認值
2.22 UUIDV4() - UUID v4 默認值
2.23 VIRTUAL() - 虛擬值
2.24 ENUM() - 枚舉
2.25 ARRAY() - 數組
2.26 GEOMETRY() - 幾何類型
2.27 GEOGRAPHY() - 地理類型
allowNull
這個對象是表示 數據表這個字段是否允許爲空
defaultValue
這個對象是隻,這個字段的默認值是多少,有就寫,沒有就可以不用加這個對象
comment
這個表示要操作的字段名
外鍵
Customer.associate = function () {
app.model.Customer.hasMany(app.model.Contacts, {
as: 'contacts',
foreignKey: 'cu_id',
targetKey: 'Id',
})
}
這個演示的是一對多,要在一這裏建立外鍵,Customer,這個是一的對象,app.model.Customer 這個也是一的對象,app.model.Contacts 這個是多的對象,as 表示多的數據表名,foreignKey 這個表示外鍵名 targetKey這個代表的是主鍵名
增刪改查
這下面要演示增刪改查,這個是對數據庫最基本的查詢
注意:所有的數據庫操作,都要在service文件中,一定要了解egg框架的基本知識才來操作orm
查數據
我們操作數據庫的時候,大多都是查數據,所以下面都是演示查詢數據
根據條件查詢全部的數據
var sequelize = this.app.sequelize
var data = this.ctx.model.Contacts.findAll({
where:{
Id:2,
}
});
根據條件查詢某幾個字段的數據
var data = this.ctx.model.Contacts.findAll({
attributes:['contacts_name','phone'],
where:{
Id:2
}
})
注意:篩選字段一定要在篩選條件的前面
用嵌套來重命名字段
var data = this.ctx.model.Contacts.findAll({
attributes: ['contacts_name', ['id', 'yte']]
})
就是把id字段重命名成yte字段
聚合操作
var data = this.ctx.model.customerdata.findAll({
attributes: [[this.app.Sequelize.fn('COUNT', sequelize.col('customer_type')), 'customer_type']]
})
排除某個字段
var data = this.ctx.model.customerdata.findAll({
attributes: { exclude: ['Id'] }
})
條件字段的或
const Sequelize = require('Sequelize')
var Op = Sequelize.Op
var data = this.ctx.model.customerdata.findAll({
where: {
[Op.or]: [{Id: 1, Id: 2}]
}
})
新增數據
var data = await this.ctx.model.customerdata.create({
company_name:'測試公司13',
customer_name:'測試客戶13',
customer_address:'測試地址13',
customer_type:4,
})
刪除數據
var data = await this.ctx.model.customerdata.destroy({
where:{
company_name:'敦豪物流公司',
}
})
刪除數據有幾種方法,但是我覺得這種最好用
修改數據
var data = await this.ctx.model.customerdata.update({
customer_name:'張三',
},{
where:{
Id:6
}
})
開啓事務
事務是我們操作關係型數據庫比較常用的,所以也要演示一下
let transaction;
try{
//創建事務
transaction = await this.ctx.model.transaction();
//用事務包裹着事件
var data_2 = await this.ctx.model.Customer.create({
company_name:'測試公司15',
customer_name:'測試客戶15',
customer_address:'測試地址15',
customer_type:4,
},{ transaction })
console.log("test test")
await transaction.commit();
return data_2;
}
catch{
await transaction.rollback();
}