在Sequelize迁移脚本中添加数据?

时间:2013-09-11 13:44:11

标签: node.js sequelize.js

如何在Sequelize迁移脚本中向表中添加数据? 这就是我得到的:

module.exports = {
up: function(migration, DataTypes, done) {
    migration.createTable(
        'person',
        {
            name: DataTypes.STRING,
            age: DataTypes.INTEGER
        },
        {
            charset: 'latin1' // default: null
        }
    );
    // I want to insert person and age.
    migration.insert(???);
    done()
},
down: function(migration, DataTypes, done) {
    migration.dropTable('queue');
    done()
}

}

4 个答案:

答案 0 :(得分:16)

我明白了。 Sequelize可从 migration.migrator.sequelize 获得。可以这样做:

up: function (migration, DataTypes, done) {
    migration.createTable(
        'Person',
        {
            name: DataTypes.STRING,
            age: DataTypes.INTEGER,
        }
    ).success(function () {
        migration.migrator.sequelize.query("insert into person (name, age) values ('Donald Duck', 60)");
        done();
    });
},
down: function (migration, DataTypes, done) {
    migration.dropTable(
      'Person'
    ).then(function() {
      done();
    })
}

答案 1 :(得分:12)

在sequelize的最新版本中,这已经改变,现在应该是

migration.createTable(
    'Person',
    {
        name: DataTypes.STRING,
        age: DataTypes.INTEGER,
    }
).then(function () {
    migration.sequelize.query("insert into person (name, age) values ('Donald Duck', 60)");
    done();
});

答案 2 :(得分:4)

实际上,运行查询并不是一个好主意。 queryInterface现在有create()和bulkCreate()。

'use strict';
module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.bulkInsert('roles', [{
      label: 'user',
      createdAt: new Date(),
      updatedAt: new Date()
    }, {
      label: 'admin',
      createdAt: new Date(),
      updatedAt: new Date()
    }]);
  },
  down: function(queryInterface, Sequelize) {
    return queryInterface.bulkDelete('roles', null, {});
  }
};

这将返回sequelize-cli预期的承诺。

来源(改编):https://github.com/sequelize/sequelize/issues/3210

答案 3 :(得分:0)

在sequelize版本4.41.2中,当您使用ES6 +并希望在迁移过程中进行更复杂的插入时,可以使up为异步函数, 创建表,然后将必要的数据插入表中。为了确保迁移成功或失败而没有进行任何更改,每个事务都要使用一个事务 与续集的互动。要注意的另一件事是up必须返回一个Promise。

创建表的示例->从其他表中获取数据->修改获取的数据->将修改后的数据插入到新表中:

module.exports = {
    up: (queryInterface, Sequelize) => queryInterface.sequelize.transaction(async (transaction) => {
        await queryInterface.createTable('person', {
            id: {
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: Sequelize.INTEGER,
            },
            name: {
                type: Sequelize.STRING,
            },
            age: {
                type: Sequelize.STRING,
            },
        }, { transaction });
        // Returns array [[results], { /** result obj */ }]
        const [dogs] = await queryInterface.sequelize.query('SELECT * FROM public."Dogs";', { transaction });
        // prepare data
        const metamorphed = dogs.map(({ name, age }) => ({
            name,
            age: parseInt((age * 7), 10),
        }));
        return queryInterface.bulkInsert('person', metamorphed, { transaction });
    }),
    down: queryInterface => queryInterface.dropTable('person'),
};