实例化 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:[] 里面可以添加 需要查找的字段 不传的话 默认查找所有