Добавить данные в Sequelize migration script?

Как добавить данные в таблицу в миграции Sequelize script? Это то, что я получил:

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()
}

}

Ответы

Ответ 1

Я понял это. Sequelize доступен из mig.mrrator.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();
    })
}

Ответ 2

В последней версии 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();
});

Ответ 3

На самом деле не рекомендуется просто запускать запрос. 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, {});
  }
};

Это возвращает обещание, как ожидалось, от sseelize-cli.

Источник (адаптирован): https://github.com/sequelize/sequelize/issues/3210

Ответ 4

В sequelize версии 4.41.2, при использовании ES6+, и вы хотите сделать более сложные вставки внутри миграции можно сделать up функции асинхронной, которая создает таблицу, а затем вставляет необходимые данные в таблицу. Чтобы гарантировать, что миграция либо завершится успешно, либо завершится неудачей без внесения каких-либо изменений, транзакция используется для каждого взаимодействия с sequelize. Еще одна важная вещь, которую стоит отметить, это то, что up должен вернуть обещание.

Пример создания таблицы → выборка данных из другой таблицы → изменение извлеченных данных → вставка измененных данных в новую таблицу:

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'),
};