sequelize.sync()如何工作,尤其是force选项?


70

sequelize.sync()上的force选项有什么作用?

sequelize.sync({
    force: true
});

具体来说,我有兴趣了解什么力量:错误呢?它不会将模式与数据库同步吗?

是否有任何关于续集的正式文档?我只能在文档中找到示例。

Answers:


52

(或多或少)正式文档和API参考可在http://sequelize.readthedocs.org/en/latest/api/sequelize/#sync中找到

问题:在尝试创建表之前force: true添加一个DROP TABLE IF EXISTS-如果您强制执行,则现有表将被覆盖。


另外:如果您更改实体的表名(已经存在),则该表将保留数据,并使用新名称创建另一个表。
Ninja Coding

6
这没有回答问题。这个问题问的是force: false做什么,而不是做什么force: true
Trevor Jex

45

OP正在询问要做什么force: false,这也是我想知道的内容,因此剩下的就是这些。

对我来说,主要的收获是各个字段没有同步(这正是我希望从水线ORM中获得的)。意思是,如果您拥有force: false表并且该表存在,那么您执行的任何字段添加/修改/删除都将不会执行。

  • beforeSync 钩子运行
  • 如果删除表 force: true
  • 表创建与 if not exists
  • 必要时添加索引
  • afterSync 钩子运行

这是github仓库中当前代码以供参考:

lib.model.js

Model.prototype.sync = function(options) {
  options = options || {};
  options.hooks = options.hooks === undefined ? true : !!options.hooks;
  options = Utils._.extend({}, this.options, options);

  var self = this
    , attributes = this.tableAttributes;

  return Promise.try(function () {
    if (options.hooks) {
      return self.runHooks('beforeSync', options);
    }
  }).then(function () {
    if (options.force) {
      return self.drop(options);
    }
  }).then(function () {
    return self.QueryInterface.createTable(self.getTableName(options), attributes, options, self);
  }).then(function () {
    return self.QueryInterface.showIndex(self.getTableName(options), options);
  }).then(function (indexes) {
    // Assign an auto-generated name to indexes which are not named by the user
    self.options.indexes = self.QueryInterface.nameIndexes(self.options.indexes, self.tableName);

    indexes = _.filter(self.options.indexes, function (item1) {
      return !_.some(indexes, function (item2) {
        return item1.name === item2.name;
      });
    });

    return Promise.map(indexes, function (index) {
      return self.QueryInterface.addIndex(self.getTableName(options), _.assign({logging: options.logging, benchmark: options.benchmark}, index), self.tableName);
    });
  }).then(function () {
    if (options.hooks) {
      return self.runHooks('afterSync', options);
    }
  }).return(this);
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.