为什么我无法回滚迁移



在我的技术负责人在我们的应用程序中实现了一个新的角色权限系统后,我无法通过回滚迁移来清除数据库。我通常运行的命令是knex --env local migrate:rollback --all。我的技术负责人创建的新迁移文件(,即,12345_updatePermissions.js(似乎是导致问题的原因,因为在我的终端中,我返回了以下错误:

migration file "12345_updatePermissions.js" failed
migration failed with error: alter table "User" alter column "role" type text check ("role" in ('Admin', 'SuperUser', 'User')) using ("role"::text check ("role" in ('Admin', 'SuperUser', 'User'))) - syntax error at or near "check"
error: alter table "User" alter column role" type text check ("role" in ('Admin', 'SuperUser', 'User')) using ("role"::text check ("role" in ('Admin', 'SuperUser', 'User'))) - syntax error at or near "check"

我试着寻找一个";"检查";在12345_updatePermissions.js中;但是,我找不到它。以下是12345_updatePermissions.js:的内容

const tableName = 'User';
exports.up = async (knex) => {
await knex.schema.alterTable(tableName, (table) => {
table.dropColumn('role');
});
await knex.schema.alterTable(tableName, (table) => {
table.enu('role', ['Owner', 'Admin', 'Researcher', 'AdvancedResearcher', 'User']).defaultTo('User');
});
};
exports.down = async (knex) => {
await knex.schema.alterTable(tableName, (table) => {
table.enu('role', ['Admin', 'SuperUser', 'User']).defaultTo('User').alter();
});
};

我曾尝试删除exports.down函数末尾的alter()方法,但没有成功(我真的认为这没有帮助,但我非常想尝试一下(。我不知道我还应该改变什么来解决这个问题。如果有人能帮我理解这个错误,我真的很感激,尤其是";"检查";,并解释我如何着手修复它。

您可以检查枚举是如何创建的,以及alter如何处理它:

https://runkit.com/embed/88ztxi2dme5a

const Knex = require('knex');
const knex = Knex({
client: 'pg',
});
knex.schema.table('table', table => {
table.enu('role', ['Admin', 'SuperUser', 'User']).defaultTo('User');
}).toSQL().map(row => console.log(row.sql))
// CREATES: "alter table "table" add column "role" text check ("role" in ('Admin', 'SuperUser', 'User')) default 'User'"
knex.schema.alterTable('table', table => {
table.enu('role', ['Admin', 'SuperUser', 'User']).defaultTo('User').alter();
}).toSQL().map(row => console.log(row.sql))
// CREATES: alter table "table" alter column "role" type text check ("role" in ('Admin', 'SuperUser', 'User')) using ("role"::text::text check ("role" in ('Admin', 'SuperUser', 'User'))) 

因此,可以看出.alter((不支持更改enu类型的列,要更改它们,必须使用原始查询,即删除旧的检查约束,然后创建一个具有更新值的新约束。

在反复使用脚本一段时间后,我终于解决了问题。我所要做的就是把table.enu('role', ['Admin', 'SuperUser', 'User']).defaultTo('User').alter()换成第14行的table.dropColumn('role')。以下是更新后的12345_updatePermissions.js:的内容

const tableName = 'User';
exports.up = async (knex) => {
await knex.schema.alterTable(tableName, (table) => {
table.dropColumn('role');
});
await knex.schema.alterTable(tableName, (table) => {
table.enu('role', ['Owner', 'Admin', 'Researcher', 'AdvancedResearcher', 'User']).defaultTo('User');
});
};
exports.down = async (knex) => {
await knex.schema.alterTable(tableName, (table) => {
table.dropColumn('role');
});
};

最新更新