我尝试在一个迁移文件中执行多个迁移语句,以便一次更改同一个表的多个列。
我想知道我是否以写入方式执行此操作,或者是否有更好的更合适的方式来执行此操作:
module.exports = {
up: function(queryInterface, Sequelize, done) {
queryInterface.changeColumn('users', 'name', {
type: Sequelize.STRING,
allowNull: false,
require: true,
unique: true
}).success(function() {
queryInterface.changeColumn('users', 'address', {
type: Sequelize.STRING,
allowNull: false,
require: true,
unique: true
}).success(function() {
queryInterface.changeColumn('users', 'city', {
type: Sequelize.STRING,
allowNull: false,
require: true,
unique: true
}).success(function() {
queryInterface.changeColumn('users', 'state', {
type: Sequelize.STRING,
allowNull: false,
require: true,
defaultValue: "ncjnbcb"
});
done();
});
});
});
}
};
但我面临一个错误:
TypeError:undefined不是函数
由于我在迁移中找不到任何调试错误的方法,如果有人帮助我解决它或者如果可能的话,告诉我们如何找出迁移中的错误的方式将会很棒。
答案 0 :(得分:13)
你的TypeError可能是因为你没有返回任何东西。 docs表示每个迁移函数都应该返回一个Promise。没有提到done
回调。
为此,请尝试以下方法:
return Promise.all([
queryInterface.changeColumn...,
queryInterface.changeColumn...
]);
答案 1 :(得分:3)
因此,这是2个答案的组合。
@Firmino Changani-效果很好,但即使失败也会完成一些迁移
@Aswin Sanakan-意味着它们都可以迁移或不迁移,但是如果第二个迁移依赖于第一个迁移,则将无法工作
我正在创建一个表并向该表添加特殊索引。所以我最终将它们结合起来,以下对我有用:
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction(async t => {
try {
await queryInterface.createTable(
'phonenumbers',
{
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
full_number: {
type: Sequelize.STRING,
unique: true
},
phone: {
type: Sequelize.STRING
},
extension: {
type: Sequelize.INTEGER,
},
country_id: {
type: Sequelize.INTEGER
},
is_valid_format: {
type: Sequelize.BOOLEAN
},
type: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
},
},
{ transaction: t }
),
await queryInterface.addIndex(
'phonenumbers',
['phone'],
{
name: 'constraint-phone-extension',
where: {extension: null},
transaction: t
}
)
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
});
},
down: async (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction(async t => {
try {
await queryInterface.dropTable('phonenumbers', { transaction: t }),
await queryInterface.removeIndex('phonenumbers', 'constraint-phone-extension', { transaction: t })
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
})
}
};
答案 2 :(得分:2)
module.exports = {
up: async (queryInterface, Sequelize) => {
try {
await queryInterface.addColumn('User', 'name', {
type: Sequelize.STRING
});
await queryInterface.addColumn('User', 'nickname', {
type: Sequelize.STRING
});
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
},
down: async (queryInterface, Sequelize) => {
try {
await queryInterface.removeColumn('Challenges', 'name');
await queryInterface.removeColumn('Challenges', 'nickname');
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
}
};
答案 3 :(得分:0)
在交易中使用const wrapper = mount(PermissionTable, {
localVue,
vuetify,
propsData: {
value: tableItems
},
sync: false
});
(迁移更安全):
Promise.all
如果某些查询被拒绝,则不使用事务而使用module.exports = {
up: async (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction(t => {
return Promise.all([
queryInterface.changeColumn('users', 'name',
{ type: Sequelize.STRING },
{ transaction: t }
),
queryInterface.changeColumn('users', 'address',
{ type: Sequelize.STRING },
{ transaction: t }
),
queryInterface.changeColumn('users', 'city',
{ type: Sequelize.STRING },
{ transaction: t }
)
]);
});
},
down: async (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction((t) => {
return Promise.all([
queryInterface.removeColumn('users', 'name', { transaction: t }),
queryInterface.removeColumn('users', 'address', { transaction: t }),
queryInterface.removeColumn('users', 'city', { transaction: t })
])
})
}
};
会导致问题。使用事务是安全的,这样可以成功执行所有操作或不进行任何更改。