f

fanpeng

V1

2022/05/11阅读:17主题:默认主题

NodeJs ORM库 sequelize 使用总结

中文文档https://sequelize.org/

安装

    $ npm i sequelize --save // 安装sequelize
    $ npm i mysql2 --save // 安装mysql

这里使用的是mysql数据库,可以官方文档中查看其他数据库连接方法

连接

//db.js
const { Sequelize } = require('sequelize'); // 导入sequelize模块
//实例化 Sequelize
const sequelize = new Sequelize('database''username''password', {
    host'host',
    dialect'mysql',
    dialectOptions:{
        dateStrings:true// 使用日期格式化
        ... //其他数据库配置
    }
});
sequelize.authenticate(); //连接数据库
module.exports = sequelize

定义 model

//model.js
const { DataTypes,Model } = require('sequelize');
const sequelize = require('db.js')
//article
class Article extends Model {}
Article.init({
    id: {
        type: DataTypes.INTEGER, // 类型
        allowNullfalse// 是否允许为空
        autoIncrementtrue// 是否自增
        primaryKeytrue // 是否主键
    },
    title: {
        type: DataTypes.STRING,
        unique:true// 是否唯一
        allowNullfalse
    },
    category_id:{
        type: DataTypes.INTEGER,
        allowNullfalse
    }
}, {
    sequelize, // 数据库连接实例
    timestampsfalse// 是否默认使用时间戳字段,为false时会默认为在查询加上updateAt和createAt字段。
    freezeTableNametrue//冻结表名,false时会自动把表已复数(Articles)形式查询
    tableName'article' // 指定表名,不指定默认为Articles
})
//category
class Category extends Model {}
Category.init({
    id: {
        type: DataTypes.INTEGER, // 类型
        allowNullfalse// 是否允许为空
        autoIncrementtrue// 是否自增
        primaryKeytrue // 是否主键
    },
    name: {
        type: DataTypes.STRING,
        unique:true// 是否唯一
        allowNullfalse
    },
}, {
    sequelize, // 数据库连接实例
    timestampsfalse,
    freezeTableNametrue
    tableName'category' 
})
//绑定关系,一对多
//关联模型时需在同一个js文件中,不然可能会报错
//可以分开文件定义模型,在同一个js文件关联模型并导出
Article.belongsTo(Category,{
    foreignKey:'category_id',//外键
})
Category.hasMany(Article,{
    foreignKey:'category_id',//外键
})
//导出model
module.exports={
    Article,
    Category
}

分页查询

const {Article, Category} = require('model.js'// 导入模型
//分页查询
let index = 1
let size = 10
Article.findAndCountAll({
    //排序
    order: [
        ['create_time''desc']
    ],
    //联表
    include: [{model:Category}],
    offset: (index-1) * size,
    limit: size,
})

条件查询

const {Article, Category} = require('model.js'// 导入模型
//分页查询
let index = 1
let size = 10
Category.findAll({
    //联表 attributes:联表需要查询的字段
    include: [{model:Article,attributes:[]}],
    //主表需要查询的字段
    attributes:[
        'id',
        'name',
        //聚合查询
        [sequelize.fn('COUNT', sequelize.col('Articles.category_id')), 'count']
    ],
    group:'Category.id',
})

分类:

前端

标签:

Node.js

作者介绍

f
fanpeng
V1