Sequelize egg使用分享

1、安裝Sequelize

由於我使用的是SQL Server數據庫 能夠根據實際使用的數據來sql

//使用的是最新是v5版本
npm install --save egg-sequelize 
npm install --save tedious
複製代碼

2、配置

1.plugin.js數據庫

exports.sequelize = {
  enable: true,
  package: 'egg-sequelize',
}
複製代碼

2.default.jsnpm

config.sequelize = {
    dialect: 'mssql',//數據庫類型
    host: '127.0.0.1',//連接地址
    port: 1433,//端口
    database: '',//數據庫名稱
    username: 'sa',//用戶名
    password: '123',//密碼
    define: {
      underscored: false,
      //使用自定義表名
      freezeTableName: true,
      //去掉默認的添加時間和更新時間
      timestamps: false,
    },
    dialectOptions: {
      options: { "requestTimeout": 300000 }//超時時間
    },
    timezone: '+08:00',//時區
  }
複製代碼

3、定義數據表

在項目目錄/app/model/userStudent.js定義數據表json

'use strict'
module.exports = app => {
  const {STRING,INTEGER, DECIMAL} = app.Sequelize
  var moment = require('moment')

  const UserStudent = app.model.define('User_Student', {
    Id: {
      type: INTEGER,
      primaryKey: true,
      autoIncrement: true,
      comment: '自增id'
    },
    StudentName: {
      type: STRING,
      comment: '校區學生姓名',
      allowNull: false, //不容許爲null
    },
    SchoolId: {
      type: INTEGER,
      comment: '校區id',
      allowNull: false, //不容許爲null
    },
    StudentGradeid: {
      type: INTEGER,
      comment: '學生目前年級',
      allowNull: false, //不容許爲null
    },
    StudentStage: {
      type: INTEGER,
      comment: '學生目前報讀階段',
    },
    StudentId: {
      type: INTEGER,
      comment: '學生id',
    },
    ParentTel: {
      type: STRING,
      comment: '家長聯繫電話',
    },
    ParentName: {
      type: STRING,
      comment: '家長姓名',
    },
    StudentSchoolname: {
      type: STRING,
      comment: '學生所在校區名稱',
    },
    StudentGender: {
      type: STRING,
      comment: '學生性別',
    },
    StudentCardid: {
      type: STRING,
      comment: '學生身份證號',
    },
    StudentAddress: {
      type: STRING,
      comment: '學生住址',
    },
    StudentAge: {
      type: INTEGER,
      comment: '學生年齡',
    },
    UserName: {
      type: STRING,
      comment: '學生使用系統帳號',
    },
    CreateTime: {
      type: STRING,//mssql獲取的時間格式有問題因此用string類型
      comment: '加入系統時間',
      allowNull: false, //不容許爲null
      get() {//格式化時間
        return this.getDataValue('CreateTime') ? moment(this.getDataValue('CreateTime')).format('YYYY-MM-DD') : ''
      },
    },
    StudentStatus: {
      type: INTEGER,
      comment: '狀態',
    },
    Operator: {
      type: INTEGER,
      comment: '操做者',
    },
    Remark: {
      type: STRING,
      comment: '備註',
    },
    Submittime: {
      type: STRING,
      comment: '提交時間',
      get() {
        return this.getDataValue('Submittime') ? moment(this.getDataValue('Submittime')).utc().format('YYYY-MM-DD HH:mm:ss') : ''
      },
      set(val) {//保存時格式化時間 以便存儲
        this.setDataValue('Submittime', moment(val).format('YYYY-MM-DD HH:mm:ss'))
      },
    },

  }, {
      //使用自定義表名
      freezeTableName: true,
      //去掉默認的添加時間和更新時間
      timestamps: false,
    })

  UserStudent.associate = function () {
    //一對一關聯表
    app.model.UserStudent.belongsTo(app.model.Person, {//關聯用戶表
      as: 'person',
      foreignKey: 'Operator',//與副表關聯的字段
      targetKey:'Id'//默認副表主鍵字段能夠自定義
    })
    app.model.UserStudent.belongsTo(app.model.School, {
      as: 'School',
      foreignKey: 'SchoolId'
    })
    app.model.UserStudent.belongsTo(app.model.Grade, {
      as: 'Grade',
      foreignKey: 'StudentGradeid'
    })

    app.model.UserStudent.belongsTo(app.model.Stage, {
      as: 'Stagedt',
      foreignKey: 'StudentStage'
    })
    //一對多關聯
    app.model.UserStudent.hasMany(app.model.UserStudentBind, {
      as: 'StudentBinddt',
      foreignKey: 'Id', 
      targetKey: 'Id',
    })
  }
  return UserStudent
}
複製代碼

推薦使用自動生成model工具可是仍是須要手動改下文件bash

npm install --save sequelize-auto mssql
複製代碼

1.配置package.jsonapp

//在scripts 增長一條配置
"scripts": {
    "model": "sequelize-auto -o .models -h 127.0.0.1 -d ce -u sa -x 123 -p 1433 -e mssql"
 },
 // -o 目錄位置
 // -h 數據庫地址
 // -d 數據庫名稱
 // -u 用戶名
 // -x 密碼
 // -p 端口號
 // -e 數據庫類型
複製代碼

2.使用命令工具

npm run model
複製代碼

3.修改生成好的文件ui

User_Student.jsthis

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('User_Student', {
    Id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    StudentName: {
      type: DataTypes.STRING,
      allowNull: false
    },
   ....
  }, {
    tableName: 'User_Student'
  });
};

複製代碼

新的User_Student.jsspa

module.exports = app => {

  const {STRING,INTEGER, DECIMAL} = app.Sequelize
  
  return app.model.define('User_Student', {
    Id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    StudentName: {
      type: DataTypes.STRING,
      allowNull: false
    },
   ....
  }, {
    tableName: 'Yx_User_Student'
  });
};
複製代碼

經常使用的sequelize方法

1、增長數據

1.單條數據增長

await this.ctx.model.UserStudent.create({})
複製代碼

2.多條數據增長

await this.ctx.model.UserStudent.bulkCreate([{},{}])
複製代碼

2、查詢數據

1.查詢單條數據

await this.ctx.model.UserStudent.findOne({
    where:{
        //條件
    }
})
複製代碼

2.查詢全部數據

await this.ctx.model.UserStudent.find({
    where:{
        //條件
    }
})
複製代碼

3.根據主鍵查詢數據

await this.ctx.model.UserStudent.findByPk(param)
複製代碼

4.原生查詢

await this.ctx.model.query('select * from UserStudent', {
   type: 'SELECT'
 })
複製代碼

5.查詢過濾不須要的字段 attributes

await this.ctx.model.UserStudent.findOne({
    where:{
        //條件
    },
    attributes:['Id']//填寫須要顯示的字段名稱
})
複製代碼

3、更新數據

1.先查詢數據後修改

let UserStudent=await this.ctx.model.UserStudent.findByPk(param)
UserStudent.update({
//須要修改的數據
},{
    fields:['','','']//不須要更新的字段
})
複製代碼

2.根據條件直接更新數據

await this.ctx.model.UserStudent.update({
   //須要修改的數據
},{
    where:{
        //條件
    }
})
複製代碼

4、刪除數據

1.先查詢數據後刪除

let UserStudent=await this.ctx.model.UserStudent.findByPk(param)
UserStudent.destroy()
複製代碼

2.根據條件直接刪除數據

await this.ctx.model.UserStudent.destroy({
     where:{
        //條件
    }
})
複製代碼

5、排序

使用order進行排序

await this.ctx.model.UserStudent.find({
    where:{
        //條件
    },
    order:[
      ['Id','desc']
    ]
})
複製代碼

6、分頁

使用 limit(限制顯示多少條數據) 和 offset(跳過多少條數據) 進行分頁

//使用findAndCountAll返回總條數
await this.ctx.model.UserStudent.findAndCountAll({
   limit:10,
   offset:0,
    where:{
        //條件
    },
    order:[
      ['Id','desc']
    ]
})
複製代碼

7、表關聯查詢

使用 include 進行表之間的關聯 首先在model裏面進行表之間的關係在查詢 也能夠臨時關聯

const res = await ctx.model.UserStudent.findAndCountAll({
               limit:10,
               offset:0,
                order: [
                    ['Submittime', 'desc']
                ],
                include: [{
                    model: ctx.model.School,
                    as: 'School',
                    include: [{//進行多重表關聯
                        model: ctx.model.AreaData,
                        as: 'ProvinceDt',
                        required: false,
                        attributes: ['Name', 'Code']
                    },
                    {
                        model: ctx.model.AreaData,
                        as: 'CityDt',
                        required: false,
                        attributes: ['Name', 'Code']
                    },
                    {
                        model: ctx.model.AreaData,
                        as: 'ZoneDt',
                        required: false,
                        attributes: ['Name', 'Code']
                    },
                    ],
                },
                {
                    model: ctx.model.Person,
                    as: 'person',
                    attributes: ['PersonName', 'Id'],
                },
                {
                    model: ctx.model.Grade,
                    as: 'Grade',
                    attributes: ['GradeName', 'Id'],
                }
                ],
            });
複製代碼

8、事務

使用 transaction 開啓事務

let transaction;//定義事務
 try {
       transaction = await this.ctx.model.transaction();//開啓事務
       await this.ctx.model.UserStudent.destroy({
             where:{
                //條件
            }
        }, { transaction })
         await transaction.commit();//提交事務
       
 } catch (error) {
      //報錯進行事務回滾
      await transaction.rollback();
}
 
複製代碼

使用的一些問題

1.當要須要在查詢的時候使用自定義後半部分的查詢條件時

let where={
    //查詢條件
}
await this.ctx.model.UserStudent.find({
    where
})
//增長自定義查詢條件
let sequelize = require('sequelize')
where.$and = sequelize.literal(`User_Student.SchoolId in (select SchoolId from  [dbo].[fn_GetUserhaveSchool](${this.userinfo.UserId},1))`)
複製代碼

2.V5的版本有一個數字存儲更新 程序會報錯的問題 解決方案是手寫更新語句來更新數據 有待官方修復

相關文章
相關標籤/搜索