2014-01-11 6 views
34

Was macht die Option force für sequelize.sync()?Wie funktioniert sequelize.sync(), speziell die Option force?

sequelize.sync({ 
    force: true 
}); 

Speziell interessiert mich zu wissen, welche Kraft: falsch tut? Wird das Schema nicht mit der Datenbank synchronisiert?

Gibt es formelle Dokumente für Sequelize? Ich konnte nur Beispiele in den Dokumenten finden.

Antwort

26

(mehr oder weniger) formale Dokumentation und API-Referenz kann bei http://sequelize.readthedocs.org/en/latest/api/sequelize/#sync

Um Ihre Frage zu finden: force: true eine DROP TABLE IF EXISTS fügt hinzu, bevor Sie versuchen, die Tabelle zu erstellen - wenn Sie erzwingen, werden vorhandene Tabellen überschrieben.

+0

Könnten Sie bitte die Links aktualisieren? – irobert91

+3

@RobertIgnat aktualisiert –

+0

Zusätzlich: Wenn Sie den Tabellennamen (der bereits existiert) einer Entität ändern, bleibt die Tabelle mit Daten und eine andere Tabelle mit dem neuen Namen wird erstellt. –

14

Das OP fragte was force: false tut, was ich auch wissen wollte, also hier ist der Rest.

Das wichtigste zum Mitnehmen, für mich war, dass die einzelnen Felder nicht synchronisiert sind (was ich gehofft hatte, aus der Waterline ORM). Das heißt, wenn Sie force: false haben und die Tabelle existiert, werden die von Ihnen angelegten Feldzugänge/Änderungen/Löschungen nicht ausgeführt.

  • beforeSync Haken laufen
  • Tabelle gelöscht wird, wenn force: true
  • Tisch mit if not exists
  • Indizes erstellt werden, falls erforderlich
  • afterSync Haken laufen

Hier ist die current code from the github repo als Referenz:

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