Sequelize 学习历程

144 阅读2分钟

从杭州回到小县城工作,新入职公司的接手第一个项目是 react + umi + egg + Sequelize,迫使自己向全栈的方向发展。由于下周要修改后端的东西,特地记录一下学习 Sequelize 的历程。

备注:此篇文章的所有代码内容基本都是跟着中文官网逻辑思路实现的,可以理解为照读官网内容,但是一些细节化的内容还需要自行官网查询。
Sequelize 提供的大多数方法都是异步的

Sequelize 中文官网传送门

安装 Sequelize

// 首先初始化 node 项目
npm init

// 下载 Sequelize 依赖包
yarn add sequelize

// 下载数据库驱动程序,这里根据实际情况选择,详见官网
yarn add mysql2

入门

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

const sequelize  = new Sequelize('sequelize', 'root', 'root', {
  dialect: 'mysql', // 选用数据库的类型
  timezone: '+08:00',
  logging: false, // 禁止控制台输出 sql
})

// 判断是否成功链接数据库
sequelize.authenticate().then(() => {
  console.log('connection success');
}).catch(() => {
  console.log('error!')
})

模型基础

const User = sequelize.define('User', {
  name: DataTypes.TEXT,
  favoriteColor: {
    type: DataTypes.TEXT,
    defaultValue: 'green'
  },
  age: DataTypes.INTEGER,
  cash: DataTypes.INTEGER,
}, {
  // freezeTableName: true, // 强制表名称等于模型名称,默认状态下是模型名的复数形式
  // timestamps: false, // 不要 createdAt & updatedAt 时间戳
  // tableName: 'customerTableName', // 自定义表名
})

// 空: 不存在表则创建表
// force: true 删除表再建立表
// alter: true 对比表结构和模型结构,并与之对应修改
User.sync({force: true}).then(data => {
  console.log('create table success');
  updateData();
  // destoryData();
  // reloadData();
}).catch(err => {
  console.log('create table fail')
})

模型实例

// A.更新实例
async function updateData() {
  // const jane = User.build({name: 'Jane'});
  // jane.save();

  // create 方法包括了 build 和 save
  const jane = await User.create({
    name: 'jane'
  });

  // 1.单个字段更新
  // jane.name = 'zhangsan';
  // jane.save();

  // 2.多个字段更新
  // jane.name = 'zhangsan';
  // jane.set({
  //   favoriteColor: 'blue',
  //   age: 28
  // })
  // save 方法会更新不止 set 的字段,其他修改也会更新
  // await jane.save();

  // 3.更新特定一组字段
  // jane.age = 28;
  // await jane.update({
  //   name: 'lisi',
  //   favoriteColor: 'yellow'
  // })
  // await jane.save();

  // 4.仅更新指定字段
  // jane.name = 'zhangsan';
  // jane.favoriteColor = 'yellow';

  // await jane.save({fields: ['name']});
  // console.log(jane.name);
  // console.log(jane.favoriteColor);

  // await jane.reload();
  // console.log(jane.name);
  // console.log(jane.favoriteColor);

  // 5.整数值自增或自减
  jane.age = 18;
  jane.cash = 2000;
  await jane.save();

  // 5.1 单个字段自增
  const singleData = await jane.increment('age', {by: 2}); // 5.1.a 如果自增 1 的话 可以省略 {by: 2}
  console.log(singleData.toJSON());

  // 5.2 多个字段自增
  const multipleData = await jane.increment(['age', 'cash'], {by: 20});
  console.log(multipleData.toJSON());

  const sqlData = await jane.reload();
  console.log(sqlData.toJSON());
}

// B.删除实例
async function destoryData() {
  const jane = await User.create({name: 'jane'});
  await jane.destroy();
}

// C.重载实例
async function reloadData() {
  const jane = await User.create({name: 'jane'});
  console.log(jane.name);
  jane.name = 'zhangsan';
  await jane.reload();
  console.log(jane.name);
}

未完...