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
未定义。