0

我已经在这个项目上成功使用了一段时间的 knex.js,这是我第一次遇到这个。我删除了所有迁移文件并删除了我的数据库(本地),而是使用 pg_dump 从我的 prod 数据库(不包括 knex_migrations 或 knex_migrations_lock 表)中获取 DDL 和所有数据。

我创建了一个新的迁移脚本并用于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 或迁移表.

任何建议将不胜感激 :)

4

3 回答 3

0

我刚进了这个洞。以下行是罪魁祸首。

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

它正在删除您的搜索路径,因此 knex 不知道在哪里可以找到任何东西。

于 2022-02-02T21:36:36.897 回答
0

使用 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;

将它们注释掉,迁移应该可以工作。您可以一次取消注释一个语句,以查看导致问题的语句。

于 2021-12-22T09:19:47.783 回答
0

该表将在运行命令时knex_migrations创建knex_migrations_lock

knex migrate:make <name of migration>

您能否确认您已执行上述 knex 命令。

一旦完成运行

knex migrate:latest

应该创建您提到的所有架构。knex.raw

于 2021-07-07T14:27:04.207 回答