How does sequelize.sync() work, specifically the force option?
The OP was asking what force: false
does, which is what I wanted to know too, so here's the rest.
The major takeaway, for me, was that the individual fields aren't synced (which is what I was hoping for, coming from the Waterline ORM). Meaning, if you have force: false
and the table exists, any field additions/modifications/deletions you have won't be executed.
beforeSync
hooks are run- table is dropped if
force: true
- table is created with
if not exists
- indexes are added if necessary
afterSync
hooks are run
Here's the current code from the github repo for reference:
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);
};
(More or less) formal docs and API reference can be found at https://sequelize.org/docs/v6/core-concepts/model-basics/#model-synchronization
To your question: force: true
adds a DROP TABLE IF EXISTS
before trying to create the table - if you force, existing tables will be overwritten.