为什么我无法回滚我的迁移?

问题描述

在我的技术负责人在我们的应用程序中实施新的角色权限系统后,我一直无法通过回滚迁移清除数据库。我通常运行的命令是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','User'))) - Syntax error at or near "check"
error: alter table "User" alter column role" type text check ("role" in ('Admin','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,['Admin','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','User')) default 'User'"

knex.schema.alterTable('table','User']).defaultTo('User').alter();
}).toSQL().map(row => console.log(row.sql))

// CREATES: alter table "table" alter column "role" type text check ("role" in ('Admin','User')) using ("role"::text::text check ("role" in ('Admin','User'))) 

所以从那可以看出 .alter() 不支持更改 enu 类型的列,并且必须使用原始查询来更改它们,这会删除旧的检查约束,然后创建一个新的更新值。