由於我使用的是SQL Server數據庫 能夠根據實際使用的數據來sql
//使用的是最新是v5版本
npm install --save egg-sequelize
npm install --save tedious
複製代碼
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',//時區
}
複製代碼
在項目目錄/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.單條數據增長
await this.ctx.model.UserStudent.create({})
複製代碼
2.多條數據增長
await this.ctx.model.UserStudent.bulkCreate([{},{}])
複製代碼
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']//填寫須要顯示的字段名稱
})
複製代碼
1.先查詢數據後修改
let UserStudent=await this.ctx.model.UserStudent.findByPk(param)
UserStudent.update({
//須要修改的數據
},{
fields:['','','']//不須要更新的字段
})
複製代碼
2.根據條件直接更新數據
await this.ctx.model.UserStudent.update({
//須要修改的數據
},{
where:{
//條件
}
})
複製代碼
1.先查詢數據後刪除
let UserStudent=await this.ctx.model.UserStudent.findByPk(param)
UserStudent.destroy()
複製代碼
2.根據條件直接刪除數據
await this.ctx.model.UserStudent.destroy({
where:{
//條件
}
})
複製代碼
使用order進行排序
await this.ctx.model.UserStudent.find({
where:{
//條件
},
order:[
['Id','desc']
]
})
複製代碼
使用 limit(限制顯示多少條數據) 和 offset(跳過多少條數據) 進行分頁
//使用findAndCountAll返回總條數
await this.ctx.model.UserStudent.findAndCountAll({
limit:10,
offset:0,
where:{
//條件
},
order:[
['Id','desc']
]
})
複製代碼
使用 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'],
}
],
});
複製代碼
使用 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的版本有一個數字存儲更新 程序會報錯的問題 解決方案是手寫更新語句來更新數據 有待官方修復