Node.js 使用sequlize 操作mysql数据库时,查询一条记录中两个字段的加和
官方文档
中文文档
Sequelize 中文文档 v4 - Basic usage - 基本用法 事务隔离级别设置
Sequelize手记 - (一)
一.使用Sequelize连接数据库
Sequelize - 使用 model 查询数据
Sequelize手记 - (一)(连接时的配置项更多)
const mysqlConfig ={
host: 'localhost', // 接数据库的主机
port: '3306', // 接数据库的端口
protocol: 'tcp', // 连接数据库使用的协议
dialect: 'mysql', // 使用mysql
// 是否开启日志,默认是用console.log
// 建议开启,方便对照生成的sql语句
//默认,显示日志函数调用的第一个参数
// logging:console.log,
//显示所有记录函数调用的参数
// logging: (...msg) => console.log(msg),
pool: {
max: 5, // 最大连接数量
min: 0, // 最小连接数量
//建立连接最长时间
// acquire: 30000,
idle: 10000 // 连接空置时间(毫秒),超时后将释放连接
},
retry: { // 设置自动查询时的重试标志
max: 3 // 设置重试次数
},
charset: 'utf8',
// dialectOptions: {
// useUTC: false //for reading from database
// },
omitNull: false, // null 是否通过SQL语句查询
timezone: '+08:00' , // 解决时差 - 默认存储时间存在8小时误差
// 是否为表添加 deletedAt 字段
// 默认情况下, destroy() 方法会删除数据,
// 设置 paranoid 为 true 时,将会更新 deletedAt 字段,并不会真实删除数据。
paranoid: false
};
//数据库名,用户名,密码
const sequelize = new Sequelize('aarontest', 'root', '123456',mysqlConfig );
或
const sequelize = new Sequelize('mysql://root:123456@localhost:3306/aarontest', {
...mysqlConfig
});
查找全部
let list = await model.findAll({
where:{
id:{$gt:10},//id大于10的
name:"test" //name等于test
},
order:[
"id", //根据id排序
["id","desc"]//根据id倒序
],
limit:10,//返回个数
offset:20,//起始位置,跳过数量
attributes:["attr1","attr2"], //返回的字段
});
//select attr1,attr2 from model where ......
二.使用Sequelize
Sequelize中用group by进行分组聚合查询
建表可以简写:
var Pet = sequelize.define('pet', {
id: {
type: Sequelize.STRING(50),
primaryKey: true
},
name: Sequelize.STRING(100),
gender: Sequelize.BOOLEAN,
birth: Sequelize.STRING(10),
createdAt: Sequelize.BIGINT,
updatedAt: Sequelize.BIGINT,
version: Sequelize.BIGINT
}, {
timestamps: false
});
三.API参考
中文文档
官方文档
API参考
四.sequelize 时区配置
const sequelize = new Sequelize(config.database, config.username, config.password, {
host: config.host,
port: config.port,
dialect: 'mysql',
pool: {
max: 5,
min: 0,
idle: 10000
},
// dialectOptions: {
// useUTC: false //for reading from database
// }, //非必须
timezone: '+08:00'
});
MySQL 8.0.12 时区设置和修改
五.sequelize格式化时间
createdAt: {
type: Sequelize.DATE,
get() {
return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss');
}
},
时间的比较可以在where中这样 endTime: {
[seq.Op.lt]: now
}
六.多列求和
let total = await Model.findAll({
where: {address}, //key-value相同可以简写
attributes: [[sequelize.literal('SUM(amount+count)'), 'result']],
raw: true // raw 对查询结果进行格式化, false 返回 instance
});
单列求和:await Model.sum('amount', {where: {userAddr}})
attributes的include属性相当于在查询结果中增加一个属性,如果和已有属性同名则覆盖。
attributes: { include: [[sequelize.fn('COUNT', sequelize.col('hats')), 'no_hats']] }
如果只是作为一个普通的返回字段使用,像这样即可attributes: ['a',[sequelize.fn('COUNT', sequelize.col('hats')), 'no_hats']]
七.更新
Model.update({
updatedAt: null,
}, {
where: {
deletedAt: {
[Op.ne]: null
}
}
});
// UPDATE model SET updatedAt = null WHERE deletedAt NOT NULL;
八、传入字符串超过20位报错Data too long for column的解决
在数据库连接或定义的options语句中添加 charset: 'utf8',
九、Associations - 关联
一对一关联(HasOne 在 target 模型中插入关联键,而 BelongsTo 将关联键插入到 source 模型中.)
一对多关联 (hasMany)
多对多关联(belongsToMany)
即使它被称为 HasOne 关联,对于大多数1:1关系,你通常需要BelongsTo关联,因为 BelongsTo 将会在 hasOne 将添加到目标的源上添加 foreignKey.
hasOne - 添加外键到目标模型,并以单数关系混入到源模型
belongsTo - 为当前模型添加外键,并以单数关系混入到源模型
hasMany - 添加外键到目标模型,并以复数关系混入到源模型
belongsToMany - 为连接的表创建N:M关系并以复数关系混入到源模型。会通过sourceId和targetId创建交叉表。
想要扁平部分用attributes和sequelize.literal,想要结构部分用include
include关键字表示关联查询。required: true设置为true是设置内部联接的关键。如果你想要一个左外连接,然后将所需更改为false,或将其保持关闭,因为这是默认值。请注意,只要在其中添加where子句,默认情况下为true。
attributes的include属性相当于在查询结果中增加一个属性,如果和已有属性同名则覆盖。
attributes: { include: [[sequelize.fn('COUNT', sequelize.col('hats')), 'no_hats']] }
也有having用法
attributes: [['name','className'], 'rank'], // 这里的attributes属性表示查询class表的name和rank字段,其中对name字段起了别名className
十、同步选项
感受下sequelizejs
User.sync()
// 标准同步
// 只有当数据库中不存在与模型同名的数据表时,才会同步
sequelize.sync()
// 动态同步
// 修改同名数据表结构,以适用模型。
sequelize.sync({alter: true})
// 强制同步
// 删除同名数据表后同步,谨慎使用,会导致数据丢失
sequelize.sync({force: true})
// 另外,当你指定表与表之间的关联后,修改被关联的表结构时会抛出异常。
// 需要先注释掉关联代码,然后更新同步模型后,再取消掉注释即可。
// 再另外,当你有新的关联时必须使用动态同步才会生效。
十一、 sequelize引起mysql错误:Too many keys specified. Max 64 keys allowed
执行sequelize.sync({alter: true})的时候,使用column: {unique: ‘column’ }
,不要使用 column: {unique: true}
十二、数据类型
大写。sequelize-cli 报Cannot read property 'toString' of undefined
错误时,检查数据类型是否正确