使用Knex创建外键时遭遇表创建竞争条件错误求助
解决Knex迁移中外键依赖的执行顺序问题
看起来你踩了Knex迁移里一个很常见的坑——迁移文件的执行顺序是由文件名开头的时间戳决定的!
你的tracks迁移文件时间戳是20190406112728,而users的是20190919103115,明显tracks的时间更早,所以Knex会先尝试创建tracks表,这时候users表还没被创建,外键约束自然会报错说"relation 'users' does not exist"。
最直接的解决方案:调整迁移文件的时间戳
你完全不需要把所有表塞进同一个迁移文件,保持一个表一个迁移是合理且推荐的做法,只需要让依赖表(也就是users)的迁移文件时间戳早于依赖它的表(tracks)的时间戳就行:
- 把
20190919103115_users.js改名为20190406112727_users.js(比tracks的时间戳早1秒即可) - 如果之前已经执行过失败的迁移,先运行
knex migrate:rollback回滚操作 - 最后重新执行
knex migrate:up,这时候Knex会先创建users表,再创建tracks表,外键约束就能正常生效了
额外说明
Knex的迁移设计是按数据库变更的先后顺序来组织的,而不是严格的"一个表对应一个文件"——比如之后要给users表新增字段,你可以新建一个时间戳更晚的迁移文件。但保持单表单迁移的方式完全没问题,只要保证依赖关系对应的时间戳顺序正确就行。
另外检查了你的字段类型:users的id是increments()(默认自增整数),tracks的owner_id是integer(),类型匹配,这部分是没有问题的。
内容的提问来源于stack exchange,提问作者ffxsam
相关产品推荐
相关产品推荐

