How to do knex.js migrations?

前端 未结 6 1443
天命终不由人
天命终不由人 2021-02-01 19:39

I\'m still not sure how to do my migrations with knex. Here is what I have so far. It works on up, but down gives me FK constraint error even though fo

6条回答
  •  一整个雨季
    2021-02-01 19:57

    I thought I'd update this, since there have been some additions to Javascript that make this quite a bit easier. knex still requires that you return a Promise but inside that Promise you can do a lot of things to clean up the code related to the creation/modification of tables. My preference is to use a combination of async/await and Promise.all.

    exports.up = function(knex, Promise) {
        return new Promise(async (resolve, reject) => {
            try {
                await Promise.all([
                    knex.schema.createTable('videos', table => {
                        table.increments('id');
                        table.string('title');
                        table.string('director');
                        table.json('meta');
                    }),
                    knex.schema.createTable('books', table => {
                        table.increments('id');
                        table.string('title');
                        table.string('author');
                        table.json('meta');
                    })
                ]);
    
                console.log('Tables created successfully');
                resolve();
            } catch(error) {
                reject(error);
            }
        })
    }
    

    If you prefer to create each table individually, then I'd just use async/await.

    exports.up = function(knex, Promise) {
        return new Promise(async (resolve, reject) => {
            try {
                await knex.schema.createTable('videos', table => {
                    table.increments('id');
                    table.string('title');
                    table.string('director');
                    table.json('meta');
                });
                console.log('videos table created successfully!');
                await knex.schema.createTable('books', table => {
                    table.increments('id');
                    table.string('title');
                    table.string('author');
                    table.json('meta');
                });
                console.log('books table created successfully!');
                resolve();
            } catch(error){
                reject(error);
            }
        })
    }
    

    This keeps things a lot cleaner, not requiring you to daisy chain a bunch of thens or wrap them in surrounding functions. You just await for each table creation to resolve and then resolve their encapsulating Promise! Yay for async/await!

    You can follow this pattern for the dropping of tables in your down migration, too. Simply replace the knex.schema.createTable statements with knex.schema.dropTable statements.

提交回复
热议问题