Sequelizejs 中的 .save 和 .create 有啥区别?

Posted

技术标签:

【中文标题】Sequelizejs 中的 .save 和 .create 有啥区别?【英文标题】:What is the difference between .save and .create in Sequelizejs?Sequelizejs 中的 .save 和 .create 有什么区别? 【发布时间】:2015-07-12 04:44:05 【问题描述】:

我是 Sequelize 的新手,并且努力了解这个非常奇怪的 ORM 新世界是如何工作的。曾经我似乎无法理解的是 Sequelizejs 中“.create”和“.save”之间的区别。我已经用这两种方法编写了测试函数,除了语法略有不同之外,它们似乎都做同样的事情。

这是使用“.save”方法

 models.User.build(
    username: req.body.username,
    password: req.body.password,
    first_name: req.body.firstName,
    last_name: req.body.lastName
  )
  .save()
  .then(function(task)
    // some function...
  )
  .catch(function(error)
    // some function...
  );

这是使用“.create”方法

  models.User.create(
    username: req.body.username,
    password: req.body.password,
    first_name: req.body.firstName,
    last_name: req.body.lastName
  ).then(function(data) 
    // some function...
  );

我在这里没有看到什么?

【问题讨论】:

使用 create 你不需要调用 .save() :) 【参考方案1】:

如文档http://docs.sequelizejs.com/en/latest/docs/instances/中所述

.build()方法创建了一个non-persistent实例,这意味着数据还没有被保存到数据库中,而只是存储在内存中, 在执行期间。当您的程序停止(服务器崩溃、执行结束或类似情况)时,使用 .build() 创建的实例将丢失。

这是 .save() 发挥作用的地方。它将.build()方法构建的实例的数据存储在数据库中。

这种方法允许您在将实例存储到数据库之前以您需要的方式对其进行操作。

.create() 方法只是将 .build().save() 实例放在同一个命令中。对于不需要操作实例的简单情况,这很方便,允许您使用单个命令将数据存储在数据库中。举例说明:

这个:

User.build( name: "John" ).save().then(function(newUser)
    console.log(newUser.name); // John
    // John is now in your db!
).catch(function(error)
    // error
);

和这个是一样的:

User.create( name: "John").then(function(newUser)
    console.log(newUser.name); // John
    // John is now in your db!
).catch(function(error)
    // error
);

但是你可以这样做:

var user = User.build( name: "John"); // nothing in your db yet

user.name = "Doe"; // still, nothing on your db

user.save().then(function(newUser)
    console.log(newUser.name); // Doe
    // Doe is now in your db!
).catch(function(error)
    // error
);

基本上,.build().save() 让您能够在实例化之后,但在将其数据存储到数据库。

【讨论】:

显然build().save() 会在isNewRecord 设置为false 时进行更新,但create() 不会进行更新,无论isNewRecord 的值如何。 (使用 Sequelize v3) 当您使用build时,该对象将在模型中定义一个默认值。【参考方案2】:

当这样使用时,它们的意思是一样的。

但最重要的是,在您的第一个示例中,.build() 实例化了 ActiveRecord,它获得了诸如关联方法以及所有 getter 和 setter 方法之类的方法。 .create() 方法只有在创建完成后才会返回 ActiveRecord。

假设您的用户与picture 相关联。有时您使用 build 方法来执行此操作:

var user = models.User.create(
    userId: req.body.userId
);

// start doing things with the user instance

user.hasPictures().then(function(hasPictures) 
    // does user have pictures?
    console.log(hasPictures)

);

而不是这样做:

models.Picture.find(
    where:  user_fkey: req.body.userId 
).then(function(picture) 
    if (picture) console.log('User has picture(s)');
);

更重要的是,你可能对 setter 方法更感兴趣..

假设您可能有一个 setter 方法来执行此操作:

setName: function(firstName, lastName) 
    var name;
    if (this.nationality === 'Chinese' || this.nationality === 'Korean' ) 
        name = lastName + ' ' + firstName;
     else 
        name = firstName + ' ' + lastName;
    
    return this.name = name

那么现在使用您的user ActiveRecord,您可以:

user.nationality = 'Korean';
user.setDataValue('setName', 'Park', 'Ji Sung');

// call other setter methods here to complete the model.

// then finally call .save()
user.save();

【讨论】:

以上是关于Sequelizejs 中的 .save 和 .create 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

DESC 中的订单记录在 SequelizeJS 中不起作用

使用 SequelizeJS 和 CLI 进行迁移

使用 SequelizeJS 编写带有外键的迁移

我真的需要在 sequelizejs 中定义模型吗?

如何在 Postgres/Postgis 中转换类型(并使用 sequelizejs)

sequelizejs 关系/关联,hasMany/belongsTo vs 定义模型上的参考