迁移与数据转储不同步:Knex.js无法识别已存在的迁移表
解决Knex.js无法识别PostgreSQL升级后已有迁移表的问题
问题分析
从日志差异可明确:Knex在新数据库中执行select * from information_schema.tables where table_name = ? and table_schema = current_schema()查询时,未找到knex_migrations表,因此尝试创建该表,但实际表已存在,导致报错。核心原因是Knex的schema匹配逻辑与实际表所在的schema不匹配。
解决方案
1. 验证表的实际位置
在新数据库中执行以下SQL,确认knex_migrations表的实际schema:
select table_schema from information_schema.tables where table_name = 'knex_migrations';
同时检查当前连接的默认schema:
show current_schema;
若两者不一致,即为问题根源。
2. 修正Knex配置的schema指定
在knexfile.js中明确指定表所在的schema(通常为public),确保Knex查询指向正确路径:
module.exports = { local: { client: 'postgresql', connection: { database: 'your_database_name', user: 'your_db_user', password: 'your_db_password', schema: 'public' // 与表实际所在schema保持一致 }, // 其他配置项... } };
3. 调整数据库用户的默认schema
若不想修改Knex配置,可将数据库用户的默认schema设置为表所在的schema:
ALTER ROLE your_db_user SET search_path TO public;
执行后重新连接数据库,再运行knex migrate:list测试。
4. 检查Knex版本一致性
确认新旧环境使用的Knex版本完全一致,不同版本的Knex对迁移表的检查逻辑可能存在差异,版本不匹配也会导致识别异常。
验证
完成上述操作后,重新执行knex migrate:list,若日志流程与旧数据库一致(依次查询knex_migrations_lock、读取迁移记录),则问题解决。
内容的提问来源于stack exchange,提问作者kaskelotti
相关产品推荐
相关产品推荐

