如何让 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');
}
};```
我正在向现有 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');
}
};```