Knex.js 迁移问题:因`关系“knex_migrations”不存在而失败`

Posted

技术标签:

【中文标题】Knex.js 迁移问题:因`关系“knex_migrations”不存在而失败`【英文标题】:Knex.js migration issue: Fails with ` relation "knex_migrations" does not exist` 【发布时间】:2021-06-12 12:40:48 【问题描述】:

我已经在这个项目上成功使用了一段时间的 knex.js,这是我第一次遇到这个问题。我删除了所有迁移文件并删除了我的数据库(本地),而是使用 pg_dump 从我的产品数据库(不包括 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 负责创建迁移表,我确保没有提及 knex 或迁移表在 DDL 中。

任何建议将不胜感激:)

【问题讨论】:

【参考方案1】:

knex_migrationsknex_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 不知道在哪里可以找到任何东西。

【讨论】:

以上是关于Knex.js 迁移问题:因`关系“knex_migrations”不存在而失败`的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Knex.js 查询多对多关系?

如何在 knex.js 模式的增量列中添加一个字母?

Alter table modify enum in Knex js for Postgresql 给出错误

带有 Express 的 Knex.js,如何在 knex.commit 后跟 knex.select 查询?

使用 Knex.js 进行多行插入

使用 Knex.js 和 PostgreSQL 设置 Docker