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();
}