web-dev-qa-db-fra.com

Comment fonctionne sequelize.sync (), en particulier l'option force?

Que fait l'option force sur sequelize.sync ()?

sequelize.sync({
    force: true
});

Plus précisément, je suis intéressé à savoir quelle force: faux fait? Ne synchronisera-t-il pas le schéma avec la base de données?

Existe-t-il des documents officiels pour sequelize? Je n'ai pu trouver que des exemples dans la documentation.

53
Naresh

Des documents (plus ou moins) formels et des références d'API peuvent être trouvés à l'adresse http://sequelize.readthedocs.org/en/latest/api/sequelize/#sync

A votre question: force: true ajoute un DROP TABLE IF EXISTS avant d'essayer de créer la table - si vous forcez, les tables existantes seront écrasées.

42
Jan Aagaard Meier

Le PO demandait quoi force: false fait, c'est ce que je voulais savoir aussi, alors voici le reste.

La principale conclusion à retenir, pour moi, était que les champs individuels ne sont pas synchronisés (c'est ce que j'espérais, venant de l'ORM Waterline). Sens, si vous avez force: false et la table existe, les ajouts/modifications/suppressions de champs que vous avez ne seront pas exécutés.

  • beforeSync les hooks sont lancés
  • la table est supprimée si force: true
  • la table est créée avec if not exists
  • des index sont ajoutés si nécessaire
  • afterSync les hooks sont lancés

Voici le code actuel du dépôt github pour référence:

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