knex.js - сбой миграции для имени динамической схемы - PullRequest
0 голосов
/ 06 февраля 2019

Среда

  • Версия Knex: knex@0.16.3
  • База данных + версия: MySQL 5.7.24
  • ОС: Linux (Manjaro)

Ошибка

Я пытаюсь настроить комплект интеграционных тестов, используя ava.Как известно, ava порождает разные процессы Node для каждого тестового файла.

Чтобы изолировать тесты, мне нужно заново создать базу данных и запустить миграции во всех тестовых файлах.Я запустил начальную загрузку и получил следующий скрипт:

import test from 'ava';
import cuid from 'cuid';
import knexFactory from 'knex';
import knexFile from './knexfile';

const knex = knexFactory(knexFile.development);

test.before(async t => {
  const schemaName = `foo_${cuid()}`;

  await knex.raw(`CREATE SCHEMA ${schemaName}`);

  try {
    await knex.migrate.latest({ schemaName });;
  } catch (err) {

  }

  Object.assign(t.context, { schemaName });
});

test.after.always(async t => {
  const { schemaName } = t.context;
  await knex.raw(`DROP SCHEMA ${schemaName}`);
});

test('foo', () => {})

Однако я сталкиваюсь со следующей ошибкой:

файл миграции "20190205110315_create_users_table.js" не удалось
миграцияошибка с ошибкой: создать таблицу users (id int без знака, не ноль, первичный ключ auto_increment, email varchar (255), password text) - Таблица 'users' уже существует

Происходит следующее: вызов .migrate.latest() игнорирует параметр schemaName и работает с конфигурацией, определенной в файле knexfile.js, то есть с фактической базой данных.

Файл миграции довольно прост:

exports.up = function(knex, Promise) {
  return knex.schema.createTable('users', table => {
    table.increments();
    table.string('email');
    table.text('password');
  })
};

exports.down = function(knex, Promise) {
  return knex.schema.dropTable('users');
};
...