Knex.js проблема с миграцией: сбой с `отношение «knex_migrations» не существует`

#javascript #node.js #postgresql #knex.js #knexjs

#javascript #node.js #postgresql #knex.js

Вопрос:

Я использовал knex.js успешно работая уже некоторое время над этим проектом, я впервые столкнулся с этим. Я удалил все свои файлы миграции и удалил свою базу данных (локально) и вместо этого использовал pg_dump для получения DDL и всех данных из моей базы данных prod (не включая таблицы knex_migrations или knex_migrations_lock).

Я создал новый сценарий миграции и использовал knex.raw для вставки всего SQL. Когда я запустил сценарий миграции, я получаю следующее:

error: insert into "knex_migrations" ("batch", "migration_time", "name") values ($1, $2, $3) - relation "knex_migrations" does not exist

Этот сценарий миграции выполняется в совершенно новой базе данных. Когда я меняю то, что есть в скрипте, на простой DDL, он работает нормально. Итак, что-то в результате pg_dump и попытки запустить его с помощью knex вызывает сбой.

На самом деле это тоже не тонна данных, поэтому я не совсем уверен, где я ошибаюсь — knex отвечает за создание таблиц миграции, и я убедился, что в DDL нет упоминания о knex или таблицах миграции.

Любые предложения будут с благодарностью приняты 🙂

Ответ №1:

Таблица knex_migrations и knex_migrations_lock будет создана при выполнении команды

knex migrate:make <name of migration>

Не могли бы вы подтвердить, что выполнили приведенную выше команду knex.

Как только это будет сделано, запуск

knex migrate:latest

следует создать всю схему, которую вы упомянули. knex.raw

Ответ №2:

Используя pd_dump для сброса базы данных в файл sql, в начале sql появляются некоторые дополнительные строки, такие как:

 SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
 

прокомментируйте их, и миграция должна сработать. Вы можете раскомментировать по одному оператору за раз, чтобы увидеть, какой из них вызывает проблему.

Ответ №3:

Я только что спустился в эту дыру. Следующая строка является виновником.

 SELECT pg_catalog.set_config('search_path', '', false);
 

Он удаляет ваш путь поиска, поэтому knex не знает, где что-либо найти.