knex migrate throws ошибка уже существует

Я использую базу данных Heroku Postgres и knexjs как конструктор SQL-запросов в моем приложении node.js. Я пытаюсь запустить последнюю миграцию knex, но получаю ошибку relation already exists, Когда я пытаюсь создать таблицу с помощью команды sql CREATE TABLE Работает без проблем.

knexfile.js

// Update with your config settings.

require('dotenv').config({ path: require('find-config')('.env') });

module.exports = {
  development: {
    client: 'pg',
    useNullAsDefault: true,
    connection: process.env.DATABASE_URL,
    searchPath: ['knex', 'public'],
  },

  staging: {
    client: 'postgresql',
    connection: {
      database: 'my_db',
      user: 'username',
      password: 'password'
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      tableName: 'knex_migrations'
    }
  },

  production: {
    client: 'postgresql',
    connection: {
      database: 'my_db',
      user: 'username',
      password: 'password'
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      tableName: 'knex_migrations'
    }
  }
};
  • последний файл миграции

Миграции /20180120183247_users_test.js

/* eslint func-names: 0 */

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

exports.down = function (knex) {
  return knex.schema
    .dropTableIfExists('users');
};

Когда я запускаю команду:

knex migrate:latest --env development

Я получаю ошибку:

Using environment: development
Knex:warning - migration file "20180120184707_initial_schema.js" failed
Knex:warning - migration failed with error: create table "users" ("id" serial primary key, "user_name" varchar(100), "password" text, "email" varchar(254)) - relation "users" already exists
error: relation "users" already exists
    at Connection.parseE (.../node_modules/pg/lib/connection.js:546:11)
    at Connection.parseMessage (.../node_modules/pg/lib/connection.js:371:19)
    at TLSSocket.<anonymous> (.../node_modules/pg/lib/connection.js:114:22)
    at emitOne (events.js:115:13)
    at TLSSocket.emit (events.js:210:7)
    at addChunk (_stream_readable.js:252:12)
    at readableAddChunk (_stream_readable.js:239:11)
    at TLSSocket.Readable.push (_stream_readable.js:197:10)
    at TLSWrap.onread (net.js:589:20)

Если я подключаюсь к базе данных и запускаю команду:

select * from users;

Я получил:

ERROR:  relation "users" does not exist
LINE 1: select * from users;

В настройках Heroku Postgres я запускаю Сброс базы данных, чтобы удалить все данные. Я ждал 2-3 минуты, а затем снова попытался запустить последнюю миграцию, но получил то же сообщение об ошибке.

3 ответа

Решение

Я не знала knex migrate:latest Команда запускает все файлы миграции, поэтому таблица users был создан в предыдущем файле миграции, и это было проблемой.

Я наткнулся на этот вопрос в надежде найти простое решение, поэтому, если кому-то еще интересно, вот что вы можете сделать, чтобы это исправить:

Если ваш БД действительно соответствует файлу миграции:

Войдите в knex_migrations таблицу (или таблицу, в которой записываются миграции, если вы переименовали ее во что-то другое) и добавьте строку с именем соответствующего файла миграции в name столбец.

Чтобы убедиться, что это работает правильно, попробуйте knex migrate:list

Убедитесь, что knex запускает файлы с теми же именами в таблице миграции. Например, проверьте таблицу миграции и убедитесь, что в ней уже есть: 20180120184707_initial_schema.js.

Если это не так, вы, вероятно, создали таблицу ранее, используя другой файл. Это может произойти, если вы ранее запускали приложение локально с помощью ts-node и использовали ts-node для прямой интерпретации машинописного текста, а затем запускали его с помощью node для интерпретации файлов js, которые были созданы, например. ts-node уже сохранил бы файл ts в таблице миграций knex, и узел может пытаться использовать файл js.

Другие вопросы по тегам