Sequelize.js: how to use migrations and sync

后端 未结 11 1426
一向
一向 2020-12-02 03:20

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

11条回答
  •  伪装坚强ぢ
    2020-12-02 04:03

    Generating the "first migration"

    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:

    1. Create a migration: sequelize migration:create
    2. Write up and down functions in your migration file
    3. According to your changes in migration file, change your model manually
    4. Run sequelize db:migrate

    Running migrations on production

    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.

    UPD Apr. 2016

    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.

提交回复
热议问题