Sequelize的日常使用

306 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

概述

最近学习 Nodejs ,发现 Sequelize 很好使用,在这里记录一下相关学习,希望能给有相同需要的同学一些帮助,也希望能够相互交流一下各自的学习经验,如果有写的不对的地方,希望可以指正,如果觉得写的可以,可以给我点个赞,谢谢!

Sequelize 介绍

官方是这样介绍的 Sequelize 是一个基于 promise 的 Node.js ORM,目前支持的数据库有

  • Postgres
  • MySQL,
  • MariaDB,
  • SQLite以及 
  • Microsoft SQL Server

它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能

数据库连接

数据库的连接方式有好几种,

const { Sequelize } = require('sequelize');

// 方法 1: 传递一个连接 URI
const sequelize = new Sequelize('sqlite::memory:') // Sqlite 示例
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname') // Postgres 示例


// 方法 2: 分别传递参数 (其它数据库)
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: /* 选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */
});

数据库连接方式定义后,我们可以加一个测试方式来验证下数据库是否连接成功

(async () => {
    try {
        await sequelize.authenticate()
        console.log('已成功建立连接');
    } catch (error) {
        console.error('连接失败', error);
    }
})();

模型定义

在 Sequelize 中定义模型有两种等效的方法

  • 调用 sequelize.define(modelName, attributes, options)
  • 扩展 Model 并调用 init(attributes, options)

比如:

module.exports = (sequelize, Sequelize) => {
  const Article = sequelize.define("article", {
    title: {
      type: Sequelize.STRING
    },
    description: {
      type: Sequelize.STRING,
      allowNull: false
    },
    status: {
      type: Sequelize.BOOLEAN,
    }
  });

  return Article;
};

创建表

初次运行,我们有可能要创建表,我们可以使用 model.sync() 方法,调用这个方式会返回一个 Promise,且会自动创建主键,默认为id,调用 model.sync() 还可以传入参数

  • model.sync() 如果表不存在,则创建表,如果存在则不做任何操作
  • model.sync({ force: true }) 将创建表,如果存在,则会将表删除后重建
  • User.sync({ alter: true }) 会检查数据库中的字段,如果和模型不匹配则会删除重建

增删改查

  • 新增:Sequelize 新增数据 提供了 一个 create 方法,相当于 buildsave 两个方法的合并,使用起来很是方便

    const jane = await User.create({ name: "Jane" });
    
  • 批量新增:model.bulkCreate([model,...],{...}) ;

  • 更新数据可以使用 update

    await article.update({ title: "xxx" })
    
  • 删除数据

    await article.destroy();
    
  • 重载实例

    我们通过调用 reload从数据库中重新加载实例

    await jane.reload();
    
  • 仅保存部分字段

    通过传递一个列名数组,可以定义在调用 save 时应该保存哪些属性.

    save({fields:[ 'name',... ]}) 只更新数组里面的字段
    

    调用这个方法只更新传递的字段

  • 查询

    • findAll 会读取数据库中整个表,

      也可以配合 attributes 可以使用嵌套数组来重命名属性

      Model.findAll({ attributes: ['foo', ['bar', 'baz'], 'qux'] });
      

      同样,也可以排除某些属性

      Model.findAll({ attributes: { exclude: ['baz'] } });
      
    • findByPk 根据主键查找

    • findOne 找到第一个实例

      const project = await Project.findOne({ where: { title: 'My Title' } });
      
    • findOrCreate 除非找到一个满足查询参数的结果,否则方法 findOrCreate 将在表中创建一个条目

    • findAndCountAll 分页查找

      const { count, rows } = await Project.findAndCountAll({
         where: {
           title: {
             [Op.like]: 'foo%'
           }
         },
         offset: 10,
         limit: 2
       });
       console.log(count);
       console.log(rows);
      

原始查询

const { QueryTypes } = require('sequelize');
const articls = await sequelize.query("SELECT * FROM `articls`");//参数是sql语句