Sequelize使用

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错误时,检查数据类型是否正确

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容