Node.js 使用sequlize 操作mysql数据库时,查询一条记录中两个字段的加和

一.使用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}

Logo

更多推荐