egg.js中的ORM

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

总的来说,我觉得orm的操作比egg-mssql方便很多,如果想要一起来讨论技术的可以添加我的QQ1693490575

发布了28 篇原创文章 · 获赞 14 · 访问量 6786

猜你喜欢

转载自blog.csdn.net/weixin_42304193/article/details/104662979