Sequelize Model sql的操作

参考资源

基本 操作




#### 示例 datebase
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 用户表 ---> 信息表
// 用户表 ---> 班级表


CREATE TABLE IF NOT EXISTS `yd_user` (
`id` int(11) auto_increment NOT NULL COMMENT '主键',
`account` varchar(25) NOT NULL COMMENT '编号',
`class_id` varchar(25) NOT NULL COMMENT '班级', -- 外键 class
`info_id` int NOT NULL COMMENT '信息表id', -- 外键 info id
`create_time` datetime NOT NULL COMMENT '创建时间',
`create_person` varchar(15) NOT NULL DEFAULT '' COMMENT '创建人',
PRIMARY KEY (`id`),
UNIQUE KEY `U_INDEX_YD_ACCOUNT` (`account`) -- 唯一索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';


CREATE TABLE IF NOT EXISTS `yd_info` (
`id` int(11) auto_increment NOT NULL COMMENT '主键',
`account` varchar(25) NOT NULL COMMENT '账号',
`user_name` varchar(15) NOT NULL COMMENT '名称',
`sex` varchar(10) NOT NULL COMMENT '性别',
`age` varchar(10) NOT NULL COMMENT '年龄',
`create_time` datetime NOT NULL COMMENT '创建时间',
`create_person` varchar(15) NOT NULL DEFAULT '' COMMENT '创建人',
PRIMARY KEY (`id`),
KEY `Index_YD_INFO_SEX` (`sex`), -- 索引
KEY `Index_YD_INFO_AGE` (`age`) -- 索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='信息表';




CREATE TABLE IF NOT EXISTS `yd_class` (
`id` int(11) auto_increment NOT NULL COMMENT '主键',
`class_id` varchar(25) NOT NULL COMMENT '班级',
`class_name` varchar(30) NOT NULL COMMENT '性别',
`create_time` datetime NOT NULL COMMENT '创建时间',
`create_person` varchar(15) NOT NULL DEFAULT '' COMMENT '创建人',
PRIMARY KEY (`id`),
KEY `Index_YD_CLASS_NAME` (`class_name`), -- 索引
UNIQUE KEY `Index_YD_CLASS_ID` (`class_id`) -- 索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班级表';

Sequelize 操作单表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//举个例子
let rows = await models.yd_user.findAndCountAll({
logging:true, //日志
attributes:[
'id','account','class_id','info_id','create_time'
// [db['sequelize_yidian'].fn('MAX', db['sequelize_yidian'].col('id')),'total'],
], // 连接池 Sequelize
rows:true,
order: [['id','DESC'],['create_time','desc']],
where:{
create_time: { $gte: '1997-01-01', $lte: formatDate(new Date()) },
account:{$like:'user%'}

}
});

关联表查询 方式一 (查询时候建立连接)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
   let rows = await models.yd_user.findAndCountAll({
logging:true,
attributes:[
'id','class_id','info_id','create_time',
[db['sequelize_yidian'].col('info.user_name'),'user_name'], //重命名字段
db['sequelize_yidian'].col('class.class_name','class_name'),
],
raw: true, //raw 的作用 合并数据
order: [['id','DESC']],
where:{'$info.id$': 1,class_id:'一'}, //关联表条件
include:[
{
attributes:[],
required:true,
association:models.yd_user.belongsTo(models.yd_info,{foreignKey:'info_id',as:'info'}),
},
{
attributes:[],
required:true,
association:models.yd_user.belongsTo(models.yd_class,{targetKey: 'class_id',foreignKey:'class_id',as:'class'}),
}
],

});


return{
"count": 1,
"rows": [
{
"id": 1,
"class_id": "一",
"info_id": 1,
"create_time": "2019-05-07T17:10:05.000Z",
"user_name": "te",
"class_name": "1班"
}
]
}

原始查询 query

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let rows = await db['sequelize_yidian'].query( //  db['sequelize_yidian'] =  自己Sequelize  连接池
`select A.ID,A.account,b.user_name,b.age from yd_user as A left join yd_info as b on a.info_id = b.id where a.id =? and b.id=? `, {
replacements: ['1','1'],
type : 'SELECT' //type 的作用
});
//结果
return [
{
"ID": 1,
"account": "user_01",
"user_name": "te",
"age": "10"
}
]

group by 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

let rows = await models.yd_class.findAll({
logging:true,
attributes:[
'class_id','class_name',
[db['sequelize_yidian'].fn('count', db['sequelize_yidian'].col('user.id')),'count']
],
raw: true,
order: [['id','DESC']],
where:{
class_id: { $lte: 3 },
'$user.id$':{ $lte: 3 } //关联表条件
},
group:'class_id',
// having:{"$count$":}, //having 报错,原因未解决
include:[
{
attributes:[],
required:true,
association:models.yd_class.belongsTo(models.yd_user,{targetKey: 'class_id',foreignKey:'class_id',as:'user'}),
}
],

});
//结果
return [
{
"class_id": "二",
"class_name": "2班",
"count": 1
},
{
"class_id": "一",
"class_name": "1班",
"count": 2
}
]

model 建立外键关系的情况

  • https://itbilu.com/nodejs/npm/41qaV3czb.html#associations-one-to-one

  • 1:1 一对一

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     //建立外键关系
    yd_user.associate = function(models){
    yd_user.belongsTo(models.yd_info,{foreignKey:'info_id',as:'info'}); //外键关系 info_id --> id 主键
    yd_user.belongsTo(models.yd_class,{targetKey: 'class_id',foreignKey:'class_id',as:'class'}); //外键关系 class_id --> class_id 非主键
    }

    //外键关系
    yd_info.associate = function (models) {
    yd_info.hasOne(models.yd_user,{foreignKey:'info_id',as:'user'});
    }



    //测试执行
    let rows = await models.yd_info.findAndCountAll({ //建立了外键关系
    logging:true,
    attributes:[
    'id','age','user_name','account'
    ],
    raw: true,
    order: [['id','DESC']],
    where:{id:'1'}, //关联表条件
    include:[
    {
    model:models.yd_user,
    as:'user',
    attributes:[],
    required:true
    },

    ]

    });
  • 1:n 一对多

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    //建立外键关系
    yd_user.associate = function(models){
    yd_user.belongsTo(models.yd_info,{foreignKey:'info_id',as:'info'}); //外键关系 info_id --> id 主键
    yd_user.belongsTo(models.yd_class,{targetKey: 'class_id',foreignKey:'class_id',as:'class'}); //外键关系 class_id --> class_id 非主键
    }

    yd_class.associate = function(models){
    yd_class.hasMany(models.yd_user,{sourceKey:'class_id',foreignKey:'class_id',as:'user'}); // 多对一
    }

    //运行测试
    let rows = await models.yd_class.findAndCountAll({ //建立了外键关系
    logging:true,
    attributes:[
    'id','class_id','class_name'
    ],
    raw: true,
    order: [['id','DESC']],
    where:{class_id:'一'}, //关联表条件
    include:[
    {
    model:models.yd_user,
    as:'user',
    attributes:[],
    required:true
    },

    ]

    });

原始查询query执行delete与update与model操作 更新update与destory 区别

  • https://cloud.tencent.com/developer/ask/47306
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    // 原始查询 query 执行 delete
    let del = await await db['sequelize_yidian'].query(
    `delete from yd_class where id = ? `, {
    replacements: [3],
    // raw:true,
    //type: 'DELETE' //加上type 返回 undefined,不好判断
    });

    let row = del[0].affectedRows;
    // let row1 = del[0]['affectedRows'];

    return {
    row1
    };


    //exp:1
    let del = await await db['sequelize_yidian'].query(
    `delete from yd_class where id = ? `, {
    replacements: [3],
    // raw:true,
    //type: 'DELETE'
    }).then(function(tagData){
    console.log(tagData.toJSON());
    });




    //model.destory

    let delss = await models.yd_class.destory({
    where :{id:3}
    });
    return {
    1
    }


    //query . update
    let up = await await db['sequelize_yidian'].query(
    `update yd_class set create_person= ? where id = ? `, {
    replacements: ['2018121',4],
    raw:false,
    type: 'UPDATE' // [null,0] 加type的区别
    });
    // let rw =up[1];
    // let rw = up[0].affectedRows;


    return {data:rw};