如何让 Sequelize 迁移文件中的 defaultValue 从某些列中取值?

How to let defaultValue in Sequelize migaration file take values from some column?

我正在向现有 table“公司”添加一个新列“companyCode”,它不应为空。此列的值会因原始数据而异,因为它采用公司名称的前三个字母(有一列“名称”包含公司名称),我尝试使用 Sequelize.litereal('//a query within') 并从“名称”列中读取但它不接受它,所以我试图让默认值采用一个函数,但仍然不起作用, 还有另一种方法可以解决这个问题吗? 这是我的代码:

'use strict';

module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface
            .addColumn('company', 'companyCode', {
                type: Sequelize.STRING(3),
                allowNull: false,
                defaultValue:  Sequelize.fn(() => {
                    let query = 'SELECT name FROM company';
                    return queryInterface.sequelize.query(query, {type: Sequelize.QueryTypes.SELECT})
                        .then(companies => {
                            console.log(companies);
                            return companies.map(company => {
                                return {
                                    companyCode: company.name.slice(0, 3).toUpperCase(),
                                };
                            });
                        })
                        .then(data => {
                            if (!data.length) return;
                            return queryInterface.bulkInsert('company', data);
                        });
                }),
            
            });
    },

    down: (queryInterface) => {
        return queryInterface.removeColumn('company', 'companyCode');
    }
};```

我会创建所有这些,然后 运行 一个脚本插入到可能来自异步工作方式的问题中。

经过多次尝试,可以通过一个包含如下查询的promise来解决:


module.exports = {
    up: async (queryInterface, Sequelize) => {
        await queryInterface.addColumn(
            'company',
            'companyCode',
            {
                defaultValue: '',
                allowNull: false,
                type: Sequelize.STRING(3)
            }
        ).then(function (result) {
                return queryInterface.sequelize.query('UPDATE company SET "companyCode"=LEFT("name",3)');
            }
            );  

    },
    down: async (queryInterface, Sequelize) => {
        await queryInterface.removeColumn('company', 'companyCode');
    }
};```