web-dev-qa-db-ja.com

sequelize.sync()の仕組み、特に強制オプションはどのように機能しますか?

Sequelize.sync()のforceオプションは何をしますか?

sequelize.sync({
    force: true
});

具体的には、私はどのような力を知っていることに興味があります:falseは何をしますか?スキーマをデータベースと同期しませんか?

続編に関する正式なドキュメントはありますか?ドキュメント内の例しか見つけることができませんでした。

53
Naresh

(多かれ少なかれ)正式なドキュメントとAPIリファレンスは http://sequelize.readthedocs.org/en/latest/api/sequelize/#sync にあります。

あなたの質問に:force: trueはテーブルを作成する前にDROP TABLE IF EXISTSを追加します-強制すると、既存のテーブルは上書きされます。

42

OPは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);
};
29
Tyler Collier