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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章