Sequelize与mysql的基础使用,增删改查

sequelize和mysql的基础使用,增删改查

​ 在接触sequelize之前,一直使用最简易mysql pool方式连接数据库,对于数据库的操作是拼接sql的方式。拼接sql的方式在小型项目中能够适用。但当项目变得复杂的时候,拼接sql的方式就变得不太方便,代码的维护量变大,需求改动会导致大量代码的重写。

安装Sequelize环境

​ 使用npm安装Sequelize环境

$ npm install --save sequelize

# 安装下面的其中之一,本次安装的是msysql2
$ npm install --save pg pg-hstore
$ npm install --save mysql2
$ npm install --save sqlite3
$ npm install --save tedious // MSSQL

数据库连接

​ Sequelize将在初始化时设置连接池,所以如果从单个进程连接到数据库,你最好每个数据库只创建一个实例。 如果要从多个进程连接到数据库,则必须为每个进程创建一个实例,但每个实例应具有“最大连接池大小除以实例数”的最大连接池大小。 因此,如果您希望最大连接池大小为90,并且有3个工作进程,则每个进程的实例应具有30的最大连接池大小。

var sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'|'sqlite'|'postgres'|'mssql',

  pool: {
    max: 5,
    min: 0,
    idle: 10000
  },

  // SQLite only
  storage: 'path/to/database.sqlite'
});

// Or you can simply use a connection uri
var sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');

测试连接

​ 我们可以使用 .authenticate() 测试连接是否成功。

sequelize
  .authenticate()
  .then(function(err) {
    console.log('Connection has been established successfully.');
  })
  .catch(function (err) {
    console.log('Unable to connect to the database:', err);
  });

Sequelize 模板

​ 模板需要设置一下三个函数 sequelize.define('name', {attributes}, {options}).以下是官方文档的例子

var User = sequelize.define('user', {
  firstName: {
    type: Sequelize.STRING
  },
  lastName: {
    type: Sequelize.STRING
  }
});

// force: true 如果表已经存在,将会把表丢弃
User.sync({force: true}).then(function () {
  // 表已经创建
  return User.create({
    firstName: 'John',
    lastName: 'Hancock'
  });
}); 

​ 以下为使用例子:

   const history = sequelize.define(
    'history',
    {
      id: {
        type: DataTypes.INTEGER,
        primaryKey: true
      },
      dt: DataTypes.STRING,
      username: DataTypes.STRING,
      mail: DataTypes.STRING,
    },
    {
      timestamps: false,
      underscored: true,
      freezeTableName: true,
      // define the table's name
      tableName: 'history'
    }
  )

查询

​ 下面可以开始最简单的查询操作。查询分为全部查询数据,根据条件查询,全部查询数据及条数(分页),查询特一数据。

  • 查询全部数据

    history.findAll().then(function(history) {
      console.log(history)
    })
    
  • 根据条件查询数据

    其中OP.or的意思是满足下面dt和name的任意一个都可以,不需要全部满足。这个Op是使用以下语句引人入才能够使用,在很多博客里都没有写明,需要查看官方博客才明了const Op = sequelize.Op;

    let data = await history.findAll({
      where:{
        [Op.or]: [
          {
            dt:{
              [Op.like]: `%${crb.dt}%`
            }
          },
          {
            name:{
              [Op.like]: `%${crb.name}%`
            }
          }
        ]
      }
    });
    

    搜索有多个条件可以供使用:

    $and: {a: 5}           // AND (a = 5)
    $or: [{a: 5}, {a: 6}]  // (a = 5 OR a = 6)
    $gt: 6,                // > 6
    $gte: 6,               // >= 6
    $lt: 10,               // < 10
    $lte: 10,              // <= 10
    $ne: 20,               // != 20
    $eq: 3,                // = 3
    $not: true,            // IS NOT TRUE
    $between: [6, 10],     // BETWEEN 6 AND 10
    $notBetween: [11, 15], // NOT BETWEEN 11 AND 15
    $in: [1, 2],           // IN [1, 2]
    $notIn: [1, 2],        // NOT IN [1, 2]
    $like: '%hat',         // LIKE '%hat'
    $notLike: '%hat'       // NOT LIKE '%hat'
    $iLike: '%hat'         // ILIKE '%hat' (case insensitive) (PG only)
    $notILike: '%hat'      // NOT ILIKE '%hat'  (PG only)
    $like: { $any: ['cat', 'hat']}
                           // LIKE ANY ARRAY['cat', 'hat'] - also works for iLike and notLike
    $overlap: [1, 2]       // && [1, 2] (PG array overlap operator)
    $contains: [1, 2]      // @> [1, 2] (PG array contains operator)
    $contained: [1, 2]     // <@ [1, 2] (PG array contained by operator)
    $any: [2,3]            // ANY ARRAY[2, 3]::INTEGER (PG only)
    
    $col: 'user.organization_id' // = "user"."organization_id", with dialect specific column identifiers, PG in this example
    
  • 根据条件查询数据及条数(分页使用)

    下面这个语句查询出来的数据包含了数据总条数,可以用来设置分页。offset是便宜数,limit为每页数量

    let data = await B.m.db.history.findAndCountAll({
      where:{
        name:{
          [Op.like]:`%${crb.name}%`
        },
        status:{
          [Op.in]:crb.status
        }
      },
      order:[
        ['id',crb.sort]
      ],
      offset: (crb.currPage - 1) * (crb.pageSize),
      limit: crb.pageSize,
    });
    
  • 查询特定数据

    根据id获得特定的数据。

let data = await template.findOne({
  where:{
    id: crb.id
  }
});

新增数据

​ 传入需要新增的数据,使用create方法即可。

await history
  .create({
    dt: momentTime,
    username: crb.username,
    mail: crb.mail,
  })

删除数据

​ 根据传入的id,删除当前id下的所有数据

let data = await template.destroy({
  where:{
    id: crb.id
  }
});

修改数据

​ 根据id修改数据,需要同时传入数据及数据特征(寻找需要修改的数据)。

let data = await template.update({
  name: crb.name,
  keyword: crb.keyword,
  owner: crb.owner,
  update_time: momentTime,
  update_commit: crb.update_commit
},{
  where:{
    id: crb.id
  }
});

总结

以上就是简易的Sequelize与mysql的教程,如果需要更为复杂的可以去Sequelize官网查看详细教程。
https://sequelize.readthedocs.io/en/latest/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值