NodeJS的sequelize操作数据库(三)

这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

一. 简单建立模型实例

Sequelize提供了incrementdecrement 实例方法

const { Sequelize, Model, DataTypes } = require("sequelize");
const sequelize = new Sequelize("sqlite::memory:");

const User = sequelize.define("user", {
  name: DataTypes.TEXT,
  favoriteColor: {
    type: DataTypes.TEXT,
    defaultValue: 'green'
  },
  age: DataTypes.INTEGER,
  cash: DataTypes.INTEGER
});

(async () => {
  // 强制更新模型表字段
  await sequelize.sync({ force: true });
})();
复制代码

二. 数值的递增和递减整实现

const jane = await User.create({ name: "李华", age: 100 });
const incrementResult = await jane.increment('age', { by: 2 });
// 注意: 如只增加 1, 你可以省略 'by' 参数, 只需执行 `user.increment('age')`

// 在 PostgreSQL 中, 除非设置了 `{returning:false}` 参数(不然它将是 undefined),
// 否则 `incrementResult` 将是更新后的 user.

// 在其它数据库方言中, `incrementResult` 将会是 undefined. 如果你需要更新的实例, 你需要调用 `user.reload()`.
复制代码
  • 多个字段递增
const jane = await User.create({ name: "Jane", age: 100, cash: 5000 });
await jane.increment({
  'age': 2,
  'cash': 100
});

// 如果值增加相同的数量,则也可以使用以下其他语法:
await jane.increment(['age', 'cash'], { by: 2 });
复制代码

三. 模型增删改查(CRUD)

创建(create)

1. Model.create()方法是使用 Model.build()构建未保存实例并使用instance.save()保存实例的简写形式.

// 创建一个新用户
const user = await User.create({ firstName: "李华", lastName: "李小龙" });
复制代码

2. fields参数只影响到该范围内的字段

const user = await User.create({
  username: '李华',
  is_auth: true
}, { fields: ['username'] });
// 假设 isAdmin 的默认值为 false
console.log(user.username); // '李华'
console.log(user.is_auth); // false
复制代码

查询(select)

// 查询所有用户
const users = await User.findAll(); // 相当于 SELECT * FROM users
复制代码

1. 查询特定属性

User.findAll({
  attributes: ['username', 'age']
});
复制代码

2. 嵌套数组重命名字段

User.findAll({
  attributes: ['age', ['username', 'name']]
});
复制代码

3. 聚合查询的sequelize.fn

  • 使用聚合函数时,必须为它提供一个别名,以便能够从模型中访问它
Model.findAll({
  attributes: [
    'id', 'display', 'margin', 'width', 'height', 'padding', // 我们必须列出所有属性...
    [sequelize.fn('COUNT', sequelize.col('margin')), 'n_margin'] // 添加聚合...
  ]
});

// 这个设计更简单
Model.findAll({
  attributes: {
    include: [
      [sequelize.fn('COUNT', sequelize.col('margin')), 'n_margin']
    ]
  }
});
复制代码
  • 查询exclude排除某些属性更方便
Model.findAll({
  attributes: { exclude: ['width'] }
});
复制代码

Guess you like

Origin juejin.im/post/7034899218472894477