20

如何在 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

5 回答 5

18

我想到了。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();
    })
}
于 2013-09-24T18:55:29.320 回答
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();
});
于 2015-04-29T14:19:28.013 回答
8

实际上,仅运行查询并不是一个好主意。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

于 2017-01-10T14:56:55.597 回答
6

在 sequelize 版本 4.41.2 中,当您使用 ES6+ 并且想要在迁移中进行更复杂的插入时,您可以创建up一个异步函数来创建您的表,然后将必要的数据插入到表中。为了确保迁移成功或失败而不进行任何更改,事务用于与 sequelize 的每次交互。另一个需要注意的重要事情是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'),
};
于 2019-01-30T16:52:17.847 回答
0

我是解决方案。这是一个例子:

    "use strict";

    module.exports = {
        up: (queryInterface, Sequelize) => {
            return queryInterface
                .createTable("roles", {
                    id: { type: Sequelize.INTEGER, autoIncrement: true, primaryKey: true },
                    name: { type: Sequelize.STRING },
                    description: { type: Sequelize.STRING },
                })
                .then(() => {
                    queryInterface.bulkInsert("roles", [{
                            name: "admin",
                            description: "Admins",
                        },
                        {
                            name: "company",
                            description: "Companies",
                        },
                        {
                            name: "user",
                            description: "Users",
                        },
                    ]);
                });
        },

    down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable("roles");
    },
};
于 2021-09-28T20:49:22.867 回答