8

我们如何在迁移中更改列类型。在我的迁移 1 中,我有一个添加了该列的迁移。现在我想将列类型从字符串更改为文本,我应该创建一个类似于 changeColumn 的新迁移文件,还是可以创建与迁移 1 相同的新迁移文件,但我只需将类型更改为文本?谢谢你。

#迁移 1

await queryInterface.addColumn(SampleModel.tableName, 'name', {
  type: Sequelize.STRING,
  allowNull: true,
}, {
  transaction,
});

迁移 2(创建新迁移会像这样工作吗?仍然 addColumn 但我将类型更改为文本)

  await queryInterface.addColumn(SampleModel.tableName, 'name', {
      type: Sequelize.TEXT,
      allowNull: true,
    }, {
      transaction,
    });
4

3 回答 3

27

您可以使用changeColumn而不是addColumn因为addColumn会在您的表中添加新列。你可以像这样定义你的迁移:

迁移文件

module.exports = {
    up: (queryInterface, Sequelize) => {
        return Promise.all([
            queryInterface.changeColumn('your table name ', 'name', {
                type: Sequelize.TEXT,
                allowNull: true,
            }, {
                transaction,
            })
        ])
    },

    down: (queryInterface, Sequelize) => {
        return Promise.all([
            queryInterface.changeColumn('your table name ', 'name', {
                type: Sequelize.STRING,
                allowNull: true,
            }, {
                transaction,
            })
        ])
    }
};
于 2020-07-01T03:26:24.073 回答
3

changeColumn需要注意的错误

我对 6.5.1 上的那些人真的很困惑,所以我认为在这里留下警告会很好。

错误 1:删除级联时的 SQLite 触发器

SQLite 没有ALTER COLUMN如下所述:

问题是 sequelize 不ON DELETE CASCADE会这样做,因此当它摆脱原始表以重新创建它时,这会触发级联,因此您会丢失数据。

他们需要做的是在迁移之前暂时放弃任何级联,然后再恢复它们。我不知道如何解决这个问题,除非围绕一个迁移,一个迁移会丢弃级联,另一个迁移会恢复它们。

值得庆幸的是,在我的用例中,这并不重要,因为 SQLite 只是一种在本地开发的快速方法,所以如果每次都对数据库进行核对就可以了,因为我可以重新植入它。考虑到 Sequelize 对不同 DBMS 的支持之间存在不一致,在本地使用 SQLite 是一个坏习惯。

type:错误 2:即使您不更改 PostgreSQL,也必须传递它

例如,如果您只想更改列的默认值,您可能想要这样做:

    await queryInterface.changeColumn('User', 'ip',
      {
        defaultValue: undefined,
      }, { transaction }
    );

但在 PostgreSQL 上,这给出了一个错误:

ERROR: Cannot read property 'toString' of undefined

由于某种原因,它没有提供回溯,我喜欢 Node.js 及其生态系统,所以经过一个小时的调试后,我发现它type是必需的。假设该列的类型为DataTypes.STRING,我们会这样做:

    await queryInterface.changeColumn('User', 'ip',
      {
        type: Sequelize.DataTypes.STRING,
        defaultValue: undefined,
      }, { transaction }
    );

否则它会尝试type.toString()在:https ://github.com/sequelize/sequelize/blob/v6.5.1/lib/dialects/postgres/query-generator.js#L466但type未定义。

于 2021-12-26T13:06:03.280 回答
0

您可以在迁移 2中使用changeColumn而不是。addColumn

文档中说明

可以更改默认值、null 值或数据类型。

于 2020-06-30T23:31:13.630 回答