We're using the orm sequelize.js and have defined a model as such:
module.exports = function(sequelize, DataTypes) {
var Source = sequelize.define('Source', {
name: {
type: DataTypes.STRING,
allowNull: false,
unique: true
}
}, {
paranoid: true
});
return Source;
};
This is deployed to production and sync'd to the database using sequelize.sync
. Next step, we add a parameter:
module.exports = function(sequelize, DataTypes) {
var Source = sequelize.define('Source', {
name: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
location: {
type: DataTypes.STRING
}
}, {
paranoid: true
});
return Source;
};
However, when deploying to production sequelize.sync
does not add this new parameter. This is because sync
does a:
CREATE TABLE IF NOT EXISTS
And does not actually update the schema if the table exists. This is noted in their documentation.
The only option seems to be to { force: true }
, however this is not okay for a production database.
Does anyone know how to properly update the schema when changes are necessary?
The documentation for Sequelize states that sequelize. sync() shoudln't be used on production, as it is potentially destructive.
The Model. upsert() method is a new method added in Sequelize v6 that allows you to perform an update statement only when a row with matching values already exist. To update a row, you need to specify the primary key of the row, which is the id column in case of the Users table.
You want to implement Sequelize migrations:
http://docs.sequelizejs.com/manual/tutorial/migrations.html
These will enable you to transition developer, staging, and production databases between known states.
A quicker way would be using {alter: true}
option.
Ref: https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#instance-method-sync
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With