浅谈Sequelize的使用

Sequelize是什么?

Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。

Sequelize 遵从 语义版本控制。 支持 Node v10 及更高版本以便使用 ES6 功能。

如何是使用Sequelize连接数据库

在config文件中配置连接信息,sqlite会与其他有一些差别

// 连接pgsql
config.sequelize = {
  dialect: 'postgres', // 连接的数据库mysql、postgres、sqlite、db2、mariadb和mssql
  database: 'bs',
  host: '10.10.3.32',
  port: '5432',
  username: 'bs',
  password: '123456',
  define: {
    freezeTableName: false, // 如果freezeTableName为true,sequelize将不会尝试更改模型名称以获取表名称。否则,型号名称将为复数
    underscored: false, // 在所有属性中添加下划线字段,包括用户定义的属性、时间戳和外键。不会影响具有显式设置字段选项的属性
  },
};

// 连接sqlite
config.sequelize = {
  host: 'localhost',
  dialect: 'sqlite',
  pool: {
    max: 5, // 连接池中的最大连接数
    min: 0, // 连接池中的最小连接数
    acquire: 30000, // 该池在引发错误之前尝试获取连接的最长时间(以毫秒为单位)
    idle: 10000, // 连接在释放之前可以处于空闲状态的最长时间(以毫秒为单位)
  },
  storage: './database.sqlite', // 仅供 sqlite 使用。默认为 ':memory:'
  operatorsAliases: false, // 基于字符串的运算符别名。将对象传递给限制别名运算符集。
};
如何建立表描述

一般会在models文件下建立表描述,也就是每一个models和数据表关联的文件,这里的字段和数据库对应起来

'use strict';

var Sequelize = require('sequelize');
 var {sequelize} = require('../sequelize.js');

 var user = sequelize.define('user',{
     id: {
         type: Sequelize.BIGINT(20),
         primaryKey: true,
         allowNull: false,
         unique: true,
         autoIncrement: true
     },
     name: Sequelize.STRING(255), // 名字
     age: Sequelize.BIGINT(11), // 年龄
     sex: Sequelize.BIGINT(1), // 性别
     create_time: Sequelize.DATE,
     update_time: Sequelize.DATE
 },{
     timestamps: false, // 不要默认时间戳 数据库没有时间戳字段时,设置为false,否则报错  SequelizeDatabaseError: Unknown column 'createdAt' in 'field list'
     freezeTableName: true 
 });

 module.exports = user;
常用的方法:
  • 增:create, build + save, bulkCreate
  • 删:destroy
  • 改:update,
  • 查:findAll, findAndCountAll, findOne, findByPk, findOrCreate
详解常用方法
    1. create

      create 方法,将上述的 build 和 save 合并为一个方法。

      const res = await User.create({ name: "小徐" });
      
    2. build + save
      const xiaoxu = User.build({ name: “小徐” });
      console.log(xiaoxu instanceof User); // true
      console.log(xiaoxu.name); // “小徐”

      // build 方法仅创建一个对象,该对象表示可以映射到数据库的数据,并没有与数据库通信
      await xiaoxu.save();// 使用 save 方法,将这个实例真正保存到数据库中。
      
    3. bulkCreate
      bulkCreate 批量创建,接收的参数为数组对象。

      const captains = await Captain.bulkCreate(
      	[ { name: '小徐' }, { name: '小明' }]
      );
      console.log(captains.length); // 2
      console.log(captains\[0] instanceof Captain); // true
      console.log(captains\[0].name); // '小徐'
      console.log(captains\[0].id); // 1 // (或另一个自动生成的值)
      

      默认情况下,bulkCreate 不会在要创建的每个对象上进行验证,而 create 可以做到。
      为了使 bulkCreate 也运行这些验证,必须通过 validata: true 参数,但这会降低性能。

      const Foo = sequelize.define('foo', {
        bar: {
          type: DataTypes.TEXT,
          validate: {
            len: [4, 6]
          }
        }
      });
      
      // 这不会引发错误,两个实例都将被创建
      await Foo.bulkCreate([
        { name: 'abc123' },
        { name: 'name too long' }
      ]);
      
      // 这将引发错误,不会创建任何内容,因为加上了 validdata: true,即会每一条都进行验证
      await Foo.bulkCreate([
        { name: 'abc123' },
        { name: 'name too long' }
      ], { validate: true });
      
      
  1. destory
    await User.destory({ where:{ id: 1002 } });

  2. update
    await User.update({ age: 19}, { where:{ id: 1002 } });

    1. findAll
      查询所有
      // 查询所有用户
      const users = await User.findAll()
      const users = await User.findAll({ where: { id: 2 } })

      // attributes 返回指定属性 
      const users = await User.findAll({
            attributes: ['name', 'age']
      })
      
      // attributes + exclude 排除某些属性
      const users = await User.findAll({
            attributes: { exclude: ['age'] }
      })
      
      // 使用嵌套数组进行重命名属性
      const users = await User.findAll({
            attributes: ['name', ['age','age2']]
      })
      
    2. findByPk
      findByPk 方法使用提供的主键从表中仅获得一个条目.
      const res = await User.findByPk(123);

      if (res === null) {
        console.log('Not found!');
      } else {
        console.log(res instanceof User); // true 它的主键是 123
      }
      
    3. findOne
      findOne 方法获得它找到的第一个条目(它可以满足提供的可选查询参数).
      const res = await User.findOne({ where: { id: ‘123’ } });

      if (res === null) {
        console.log('Not found!');
      } else {
        console.log(res instanceof User); // true
        console.log(res.id); // '123'
      }
      
    4. findOrCreate
      找不到就创建。返回值是一个实例(找到的实例或创建的实例)和一个布尔值,true 即为创建。
      const [user, created] = await User.findOrCreate({
      where: { username: ‘小徐’ },
      defaults: {
      job: ‘Technical Lead JavaScript’
      }
      });

      console.log(user.username); // '小徐'
      console.log(user.job); // 这可能是也可能不是 'Technical Lead JavaScript'
      console.log(created); // 指示此实例是否刚刚创建的布尔值
      
      if (created) { // created === true 即是创建
        console.log(user.job); // 这里肯定是 'Technical Lead JavaScript'
      }
      
    5. findAndCountAll
      常用作处理与分页有关的查询,该方法是结合了 findAll 和 count 的便捷方法。

      (1)当没有提供 group 时, findAndCountAll 方法返回一个具有两个属性的对象:

      count :一个整数(与查询匹配的记录总数)
      rows :一个数组对象(获得的记录)
      (2)当提供了 group 时, findAndCountAll 方法返回一个具有两个属性的对象:

      count - 一个数组对象(包含每组中的合计和预设属性)
      rows - 一个数组对象(获得的记录)

      const { count, rows } = await User.findAndCountAll({
        where: {
          title: {
            [Op.like]: 'foo%'
          }
        },
        offset: 10,
        limit: 2
      });
      console.log(count);
      console.log(rows);
      
  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值