在指定列之后添加列和索引列的数据库迁移

14

我希望能够在某一列后通过迁移添加列,并对其进行索引(普通MySQL索引而不是唯一索引)。是否可以通过sequelize.js实现此目的?如果可以,如何操作?如果不行,有没有其他迁移方式的替代方案。

我们能否在sequelize迁移中执行自定义查询。

以下是我的现有迁移文件。

'use strict';

module.exports = {
  up: function (queryInterface, Sequelize) {
    return queryInterface.addColumn('UserDetails', 'user_id', {
      type: Sequelize.INTEGER,
    });
  },

  down: function (queryInterface, Sequelize) {
    return queryInterface.removeColumn('UserDetails', 'user_id');
  }
};
2个回答

62

您可以在选项中传递afterbefore,以在某些指定列后添加列。

'use strict';

module.exports = {
up: function (queryInterface, Sequelize) {
return queryInterface.addColumn('UserDetails', 'user_id', {
  type: Sequelize.INTEGER,
  after: "some_column"
});
},

down: function (queryInterface, Sequelize) {
return queryInterface.removeColumn('UserDetails', 'user_id');
}
};

P.S. after选项仅受MySQL支持。https://github.com/sequelize/sequelize/blob/master/lib/query-interface.js#L495


7
这个代码是在哪个 Sequelize 版本中工作的?我使用的是 CLI 版本 3.9.1,但好像不起作用。 - Dan Mandle
令人沮丧的是这没有被标记为答案,但这正是我正在寻找的。谢谢Vivek! - Zacho
1
after 的效果很好。我尝试使用 before,但没有成功。不过,我认为这应该是被接受的答案。 - chrislebaron
1
@Blackjack 这只适用于MySQL。您实际上可以检查查询界面,看看SQL Server的可能性是什么。 - Vivek V Dwivedi
@FreddyDaniel,文档链接已经失效。这是新的链接:DOC - Sandokan El Cojo
显示剩余3条评论

0
据我所知,没有通过addColumn函数实现它的方法。
但是你可以通过原始的SQL查询来实现:
ALTER TABLE UserDetails CHANGE COLUMN user_id user_id VARCHAR(50) AFTER some_column;

您可以像这样在迁移中运行自定义 SQL 查询:

module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.sequelize.query("ALTER TABLE UserDetails CHANGE COLUMN user_id user_id VARCHAR(50) AFTER some_column;")
  },
  down: function(queryInterface, Sequelize) {
    return true;
  }
};

既然您已经在使用自定义 SQL,您可以通过原始 SQL 添加新列,并将其放置在您选择的列之后:

ALTER TABLE UserDetails ADD COLUMN user_id VARCHAR(50) AFTER some_column;

目前在PostgreSQL中,即使使用原始SQL查询,仍存在“AFTER”子句不受支持的问题。我收到了错误消息:“ERROR:syntax error at or near 'AFTER'”。 - Hana Hasanah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接