Sequelize js,我们如何在迁移中更改列类型

新手上路,请多包涵

我们如何更改迁移中的列类型。在我的迁移 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,
    });

原文由 user13829188 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 418
2 个回答

changeColumn 需要注意的错误

我真的被 6.5.1 上的那些人弄糊涂了,所以我认为在这里留下警告会很好。

错误 1:SQLite 触发删除级联

SQLite 没有 ALTER COLUMN 如在:

修复 SQLite 无法更改现有表中的列的包装器。它将创建表的备份,之后删除表并创建一个具有相同名称但具有相应列的修改版本的新表。

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

他们需要做的是在迁移之前暂时删除任何级联并在之后恢复它们。我不确定如何解决这个问题,除非围绕一个迁移,一个迁移会删除级联,另一个迁移会恢复它们。

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

错误 2:你必须在 PostgreSQL 上传递 type: 即使你没有改变它

例如,如果您只想更改您可能想要执行的列的默认值:

   up: async (queryInterface, Sequelize) => queryInterface.sequelize.transaction(async transaction => {
    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 未定义。

原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 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,
            })
        ])
    }
};

原文由 Vyas Arpit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题