【问题标题】:Add data in Sequelize migration script?在 Sequelize 迁移脚本中添加数据?
【发布时间】:2013-09-15 13:58:34
【问题描述】:

如何在 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()
}

}

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

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

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

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

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

    【讨论】:

    【解决方案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, {});
      }
    };
    

    这会按照 sequelize-cli 的预期返回一个承诺。

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

    【讨论】:

    • 谢谢。这回答了如何插入数据,但是首先获取数据的正确方法是什么?例如,我正在尝试将数据插入另一个表中的两列中的新表。
    【解决方案4】:

    我想通了。 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();
        })
    }
    

    【讨论】:

    • 这些查询返回承诺。在承诺得到满足之前,您最好不要致电done(),否则您的下一次迁移可能会失败。 migration.dropTable('Person').then(function(){done()})
    • migration.migrator.sequelize.query 现在应该是migration.sequelize.query
    【解决方案5】:

    在最新版本的 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();
    });
    

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 2014-12-25
      相关资源
      最近更新 更多