sequelize 模型实例——迹忆客-ag捕鱼王app官网
如大家所知,模型是 。 类的实例表示该模型中的一个对象(该对象映射到数据库中表的一行)。 这样,模型实例就是 。
对于本指南,将假定以下设置:
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 });
// 这里是代码
})();
创建实例
尽管模型是一个类,但是你不应直接使用 new
运算符来创建实例。 相反,应该使用 build 方法:
const jane = user.build({ name: "jane" });
console.log(jane instanceof user); // true
console.log(jane.name); // "jane"
但是,以上代码根本无法与数据库通信(请注意,它甚至不是异步的)! 这是因为 build 方法仅创建一个对象,该对象 表示 可以 映射到数据库的数据。 为了将这个实例真正保存(即持久保存)在数据库中,应使用 save
方法:
await jane.save();
console.log('jane 已保存到数据库!');
注意
,从上面代码段中的await
用法来看,save
是一种异步方法。 实际上,几乎每个sequelize
方法都是异步的。 build 是极少数例外之一。
非常有用的捷径: create 方法
sequelize提供了 create 方法,该方法将上述的 build 方法和 save 方法合并为一个方法:
const jane = await user.create({ name: "jane" });
// jane 现在存在于数据库中!
console.log(jane instanceof user); // true
console.log(jane.name); // "jane"
注意: 实例记录
尝试将模型实例直接记录到 console.log 会产生很多问题,因为 sequelize 实例具有很多附加条件。 相反,你可以使用 .tojson()
方法(顺便说一句,它会自动保证实例被 json.stringify
编辑好)。
const jane = await user.create({ name: "jane" });
// console.log(jane); // 不要这样!
console.log(jane.tojson()); // 这样最好!
console.log(json.stringify(jane, null, 4)); // 这样也不错!
默认值
内置实例将自动获得默认值:
const jane = user.build({ name: "jane" });
console.log(jane.favoritecolor); // "green"
更新实例
如果你更改实例的某个字段的值,则再次调用 save 将相应地对其进行更新:
const jane = await user.create({ name: "jane" });
console.log(jane.name); // "jane"
jane.name = "ada";
// 数据库中的名称仍然是 "jane"
await jane.save();
// 现在该名称已在数据库中更新为 "ada"!
我们可以使用 set 方法一次更新多个字段:
const jane = await user.create({ name: "jane" });
jane.set({
name: "ada",
favoritecolor: "blue"
});
// 如上, 数据库中还是 "jane" 和 "green"
await jane.save();
// 数据库现在将 "ada" 和 "blue" 作为 name 和 favoritecolor
请注意, 此处的 save()
也将保留在此实例上所做的任何其他更改, 而不仅仅是之前的 set 调用中的更改。如果要更新一组特定的字段, 可以使用update:
const jane = await user.create({ name: "jane" });
jane.favoritecolor = "blue"
await jane.update({ name: "ada" })
// 数据库现在将 "ada" 作为 name,但仍然有默认的 "green" 作为 favoritecolor
await jane.save()
// 数据库现在将 "ada" 作为 name,但仍然有默认的 "blue" 作为 favoritecolor
删除实例
我们可以通过调用 destroy 来删除实例:
const jane = await user.create({ name: "jane" });
console.log(jane.name); // "jane"
await jane.destroy();
// 现在该条目已从数据库中删除
重载实例
我们可以通过调用 reload 从数据库中重新加载实例:
const jane = await user.create({ name: "jane" });
console.log(jane.name); // "jane"
jane.name = "ada";
// 数据库中的名称依然是 "jane"
await jane.reload();
console.log(jane.name); // "jane"
reload 调用生成一个 select
查询,以从数据库中获取最新数据.
仅保存部分字段
通过传递一个列名数组,可以定义在调用 save 时应该保存哪些属性.
当你基于先前定义的对象设置属性时,例如,当你通过 web 应用程序的形式获取对象的值时,这很有用. 此外,这在 update 实现中内部使用. 它是这样的:
const jane = await user.create({ name: "jane" });
console.log(jane.name); // "jane"
console.log(jane.favoritecolor); // "green"
jane.name = "jane ii";
jane.favoritecolor = "blue";
await jane.save({ fields: ['name'] });
console.log(jane.name); // "jane ii"
console.log(jane.favoritecolor); // "blue"
// 上面显示为 "blue",因为本地对象将其设置为 "blue",
// 但是在数据库中它仍然是 "green":
await jane.reload();
console.log(jane.name); // "jane ii"
console.log(jane.favoritecolor); // "green"
save 的变化点
save 方法在内部进行了优化,只更新真正改变的字段。 这意味着如果我们不更改任何内容并调用 save,sequelize 将知道保存是多余的并且什么也不做,即不会生成任何查询(它仍然会返回一个 promise,但它会立即解决)。
此外,如果在调用 save 时只有少数属性发生了变化,那么在 update
查询中只会发送这些字段,以提高性能。
递增和递减整数值
为了递增/递减实例的值而不会遇到并发问题,sequelize提供了 increment 和 decrement 实例方法.
const jane = await user.create({ name: "jane", 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 });
递减的工作原理完全相同.