回滚迁移时不会删除表

问题描述

当我从Knex执行回滚命令时,它只会从knex_migrations表中删除行,而不会从迁移创建的表中删除行。

我正在使用MysqL,但是sqlite3也会发生同样的情况。

GitHub存储库:https://github.com/patrick-vieira/knex-rollback

第一次迁移:

import * as Knex from 'knex';

export async function up(knex: Knex): Promise<void>{
  return knex.schema.createTable('users',table => {

    table.increments('id').primary();
    
    table.string('name').notNullable();
    table.string('avatar').notNullable();
    table.string('whatsapp').notNullable();
    table.string('bio').notNullable();
  });
}

// roolback
export async function down(knex: Knex): Promise<void> {
  knex.schema.dropTable('users');
}

解决方法

您始终需要从knexup函数返回down操作的结果。如果您看一下我已为问题编辑的示例,则会看到您在return中使用了up语句,但没有在down中使用。

此外,迁移会返回架构生成器(不是void)。我通常不会在TS中编写迁移,但我认为您正在寻找的是基于签名的东西,

import Knex,{ SchemaBuilder } from 'knex'

export const up = (knex: Knex): SchemaBuilder => {
  return knex.schema.createTable( // ... etc ...
}

确保始终记得返回结果的一种技巧是利用箭头功能自动返回:

export const up = (knex: Knex) => knex.schema.createTable(
  // ... etc ...