NodeJs ORM库 sequelize 使用总结

531 阅读1分钟

中文文档www.sequelize.com.cn/

安装

    $ 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, // 类型
        allowNull: false, // 是否允许为空
        autoIncrement: true, // 是否自增
        primaryKey: true // 是否主键
    },
    title: {
        type: DataTypes.STRING,
        unique:true, // 是否唯一
        allowNull: false
    },
    category_id:{
        type: DataTypes.INTEGER,
        allowNull: false
    }
}, {
    sequelize, // 数据库连接实例
    timestamps: false, // 是否默认使用时间戳字段,为false时会默认为在查询加上updateAt和createAt字段。
    freezeTableName: true, //冻结表名,false时会自动把表已复数(Articles)形式查询
    tableName: 'article' // 指定表名,不指定默认为Articles
})
//category
class Category extends Model {}
Category.init({
    id: {
        type: DataTypes.INTEGER, // 类型
        allowNull: false, // 是否允许为空
        autoIncrement: true, // 是否自增
        primaryKey: true // 是否主键
    },
    name: {
        type: DataTypes.STRING,
        unique:true, // 是否唯一
        allowNull: false
    },
}, {
    sequelize, // 数据库连接实例
    timestamps: false,
    freezeTableName: true, 
    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',
})