IT이야기

Sequelize.sync(), 특히 강제 옵션 작동 원리

cyworld 2021. 10. 25. 21:30
반응형

Sequelize.sync(), 특히 강제 옵션은 어떻게 작동합니까?


Sequelize.sync()의 강제 옵션은 무엇을 합니까?

sequelize.sync({
    force: true
});

특히, 나는 어떤 힘을 알고 싶습니다: false가 무엇을 합니까? 스키마를 데이터베이스와 동기화하지 않습니까?

후속작에 대한 공식 문서가 있습니까? 문서 내에서만 예제를 찾을 수 있었습니다.


(다소) 공식 문서 및 API 참조는 http://sequelize.readthedocs.org/en/latest/api/sequelize/#sync 에서 찾을 수 있습니다 .

귀하의 질문에 : 테이블을 생성하기 전에 force: true추가 DROP TABLE IF EXISTS합니다. 강제로 수행하면 기존 테이블을 덮어씁니다.


OP는 force: false내가 알고 싶었던 것이 무엇인지 묻고 있었기 때문에 나머지는 여기에 있습니다.

저에게 있어 가장 중요한 점은 개별 필드가 동기화되지 않는다는 것입니다(이는 Waterline ORM에서 가져온 것입니다). 당신이있는 경우에 의미, force: false그리고 테이블이 존재, 당신이 가진 모든 필드 추가 / 수정 / 삭제가 실행되지 않습니다.

  • beforeSync 후크가 실행됩니다
  • 다음과 같은 경우 테이블이 삭제됩니다. force: true
  • 로 테이블이 생성됩니다. if not exists
  • 필요한 경우 인덱스가 추가됩니다.
  • afterSync 후크가 실행됩니다

참고로 github repo현재 코드는 다음과 같습니다 .

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);
};

ReferenceURL : https://stackoverflow.com/questions/21066755/how-does-sequelize-sync-work-specifically-the-force-option

반응형