我们如何更改迁移中的列类型。在我的迁移 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 许可协议
changeColumn
需要注意的错误我真的被 6.5.1 上的那些人弄糊涂了,所以我认为在这里留下警告会很好。
错误 1:SQLite 触发删除级联
SQLite 没有
ALTER COLUMN
如在:在 sqlite 中更改列
https://sequelize.org/master/class/lib/dialects/sqlite/query-interface.js~SQLiteQueryInterface.html
问题是 sequelize 不会采取
ON DELETE CASCADE
这样做,所以当它摆脱原始表重新创建它时,这会触发级联,因此您会丢失数据。他们需要做的是在迁移之前暂时删除任何级联并在之后恢复它们。我不确定如何解决这个问题,除非围绕一个迁移,一个迁移会删除级联,另一个迁移会恢复它们。
值得庆幸的是,在我的用例中它并不重要,因为 SQLite 只是一种在本地开发的快速方法,所以如果它每次都对数据库进行核对就很好,因为我可以重新播种它。考虑到 Sequelize 对不同 DBMS 的支持不一致,在本地使用 SQLite 是一个坏习惯。
错误 2:你必须在 PostgreSQL 上传递
type:
即使你没有改变它例如,如果您只想更改您可能想要执行的列的默认值:
但是在 PostgreSQL 上,这给出了一个错误:
出于某种原因,它不提供回溯,我喜欢 Node.js 及其生态系统,所以经过一个小时的调试后,我发现
type
是必需的。假设列的类型是DataTypes.STRING
,我们会这样做:否则它会尝试做一个
type.toString()
在: https ://github.com/sequelize/sequelize/blob/v6.5.1/lib/dialects/postgres/query-generator.js#L466 但是type
未定义。