使用orm框架 sequelize 操作mysql (1) --实例化,建立连接池,创建模型,关联表

786 阅读2分钟
实例化 sequelize 创建连接池:

const Sequelize = require('sequelize');
const config = require('../config/config'); 

const sequelize = new Sequelize(config.db.database,config.db.user,config.db.password,{
    host:config.db.host,
    dialect:'mysql',       //数据库类型
    logging:true,           //操作时候显示原始的sql语句  
    timezone:'+08:00',      //设置为北京时间
    define: {
        // `timestamps` 字段指定是否将创建 `createdAt` 和 `updatedAt` 字段.
        timestamps: false,
        freezeTableName: true,  //冻结表名 否则表名自变成复数
        underscored: true,        // 字段以下划线(_)来分割(默认是驼峰命名风格)
        charset:'utf8mb4'         //创建表设置utf-8  解决不能插入中文问题
      },
    pool: {
        max: 5,             // 连接池最大连接数量
        min: 0,             // 连接池最小连接数量
        idle: 10000         // 如果一个线程超过10秒钟没有被使用过就释放该线程
      }
});

// 创建同步表   force = true  时会把存在的表先 drop 掉再创建,好怕怕 alter = true 同步字段
sequelize.sync({
    force: false,
    alter: true
})

module.exports = sequelize;


2.使用 sequelize.define:建立模型 User 和 Article 并且建立关联

const Sequelize = require('sequelize');
const sequelize = require('../core/db');

const User = sequelize.define('user',{
    id:{
        type:Sequelize.INTEGER,    //注意 这里的Sequelize是引入的npm包  不是实例化的
        primaryKey:true,    
        allowNull:false,
        autoIncrement:true,
        unique:true                
    },
    userName:Sequelize.STRING(22),
    password:Sequelize.STRING,
    email:Sequelize.STRING,
    introduction:Sequelize.TEXT,
    avart:{
        type:Sequelize.STRING,
        defaultValue:'https://img.socialmarketings.com/article/2019/12/1576041203581.jpg'
    },
    userType:{
        type:Sequelize.BIGINT,
        defaultValue:0
    },
    bImage:{
        type:Sequelize.STRING,
        defaultValue:'https://img.socialmarketings.com/banner/2019/12/1576038652668.jpg'
    },
    registerTime:Sequelize.DATE
})


/**
 * 创建文章模型
 * Article
 */
const Article = sequelize.define('article',{
    id:{
        type:Sequelize.INTEGER,
        primaryKey:true,
        autoIncrement:true,
        allowNull:false,
        unique:true
    },
    title:Sequelize.STRING,
    describe:Sequelize.STRING,
    coverImage:Sequelize.STRING,
    sortId:Sequelize.STRING,
    content:Sequelize.TEXT,
    readCount:{
        type:Sequelize.STRING,
        defaultValue:0
    },
    commentCount:{
        type:Sequelize.STRING,
        defaultValue:0
    },
    userId:Sequelize.INTEGER,
    createTime:{
        type:Sequelize.DATE,
        defaultValue:new Date()
    }
})


/**
 * 定义表关联
 * foreignKey 外键
 * targetKey 目标键
 * belongsTo  属于
 */
Article.belongsTo(User,{foreignKey:'userId',targetKey:'id'}); 
User.hasMany(Article)

module.exports = {User,Article};


// 相应字段有: 
// type 字段数据类型(sequlize. …) 
// allowNull(是否允许为空true,false) 
// autoIncrement(自增, true ,false) 
// unique(唯一性, true,false, string) 
// comment (解释 说明)
// defaultValue (字段默认值)
// primaryKey (对主键的设置, true,false) 
// defaultValue(默认值的设置) 

如上所示,我们定义了User和Article两个模型
Article.belongsTo(User)
并通过belongsTo指定了Article -User之间为1:1关系。一篇文章只能属于一个人
User.hasMany(Article)
通过 hasMany 一对多 一个人可以拥有很多的文章


3.应用关联模型:查询

/**
 * 根据用户id获取文章
 * param: articleId
 */
router.get('/getUserArticle',async (ctx,next)=>{
   let data = await Article.findAll({
        where:{
            userId:ctx.request.query.articleId
        },
        include:[{                      
            model:User,
            as: 'user',
            // attributes: ['userName']
        }]   
    })
    ctx.body = {
        code:200,
        data:data
    }

})

可以在include查询选项中,通过'model'属性指定要连接查询的模型,还可以通过'as'属性指定别名。attributes:[] 里面可以添加 需要查找的字段 不传的话 默认查找所有