Подтвердить что ты не робот

Как работает функция sequelize.sync(), в частности параметр force?

Что делает параметр force for sequelize.sync()?

sequelize.sync({
    force: true
});

В частности, мне интересно узнать, какая сила: ложь? Не будет ли синхронизация схемы с базой данных?

Существуют ли какие-либо формальные документы для секвестрирования? Я мог только найти примеры внутри документов.

4b9b3361

Ответ 1

(Более или менее) формальные документы и ссылки на API можно найти по адресу http://sequelize.readthedocs.org/en/latest/api/sequelize/#sync

На ваш вопрос: force: true добавляет DROP TABLE IF EXISTS, прежде чем пытаться создать таблицу - если вы принудительно, существующие таблицы будут перезаписаны.

Ответ 2

ОП задавал вопрос о том, что делает force: false, и это то, что я хотел знать, так что вот остальные.

Основной вывод для меня состоял в том, что отдельные поля не синхронизированы (на что я надеялся, исходя из Waterline 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);
};