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_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 不知道在哪里可以找到任何东西。
【讨论】:
以上是关于Knex.js 迁移问题:因`关系“knex_migrations”不存在而失败`的主要内容,如果未能解决你的问题,请参考以下文章
Alter table modify enum in Knex js for Postgresql 给出错误