I\'m close to having my project ready to launch. I have big plans for after launch and the database structure is going to change -- new columns in existing tables as well as
In your case, the most reliable way is to do it almost manually. I would suggest to use sequelize-cli tool. The syntax is rather plain:
sequelize init
...
sequelize model:create --name User --attributes first_name:string,last_name:string,bio:text
This will create both model AND migration. Then, manually merge your existing models with generated with sequelize-cli, and do the same with migrations. After doing this, wipe database (if possible), and run
sequelize db:migrate
This will create schema will migrations. You should do this only once to switch to proper process of schema developments (without sync:force, but with authoritative migrations).
Later, when you need to change schema:
sequelize migration:create
sequelize db:migrate
Obviously you can't ssh to production server and run migrations by hands. Use umzug, framework agnostic migration tool for Node.JS to perform pending migrations before app starts.
You can get a list of pending/not yet executed migrations like this:
umzug.pending().then(function (migrations) {
// "migrations" will be an Array with the names of
// pending migrations.
});
Then execute migrations (inside callback). The execute method is a general purpose function that runs for every specified migrations the respective function:
umzug.execute({
migrations: ['some-id', 'some-other-id'],
method: 'up'
}).then(function (migrations) {
// "migrations" will be an Array of all executed/reverted migrations.
});
And my suggestion is to do it before app starts and tries to serve routes every time. Something like this:
umzug.pending().then(function(migrations) {
// "migrations" will be an Array with the names of
// pending migrations.
umzug.execute({
migrations: migrations,
method: 'up'
}).then(function(migrations) {
// "migrations" will be an Array of all executed/reverted migrations.
// start the server
app.listen(3000);
// do your stuff
});
});
I can't try this right now, but at first look it should work.
After a year, still useful, so sharing my current tips. For now, I'm installing sequelize-cli
package as required live dependancy, and then modify NPM startup scripts in package.json
like this:
...
"scripts": {
"dev": "grunt && sequelize db:migrate && sequelize db:seed:all && node bin/www",
"start": "sequelize db:migrate && sequelize db:seed:all && node bin/www"
},
...
The only thing I need to do on production server is npm start
. This command will run all migrations, apply all seeders and start app server. No need to call umzug manually.