Rails部署Heroku执行db:migrate报dateti类型不存在错误
问题产生原因
- 核心原因是你修改本地迁移文件后,没有将变更提交并推送到Heroku远程环境。
heroku run rails db:migrate执行时读取的是Heroku服务器上存储的代码,不是你本地修改后的文件,因此仍然会加载到写有错误类型dateti的旧版本迁移文件。 - 本地SQLite和Heroku上PostgreSQL的类型校验规则差异是问题仅在生产环境出现的原因:SQLite采用动态类型机制,对字段类型名的校验非常宽松,即使写了不存在的类型,多数场景下会自动做兼容处理不会抛错;而PostgreSQL是强静态类型系统,遇到未定义的类型会直接终止迁移流程。
解决方法
按以下顺序操作即可修复:
- 确认本地
AddActivationToUsers迁移文件的修改已经保存,在项目根目录提交变更到本地Git仓库:
git add db/migrate/*add_activation_to_users.rb git commit -m "Fix typo: correct activated_at column type to datetime"
- 将最新代码推送到Heroku部署环境:
git push heroku main
如果你本地部署用的分支不是main(比如旧项目常用master),将命令里的main替换为实际部署的分支名即可。
3. 部署完成后,先验证远程环境的迁移文件是否已经更新(可选,用来排查推送异常):
heroku run cat db/migrate/*add_activation_to_users.rb
确认输出的代码里activated_at字段类型为:datetime后,重新执行迁移命令:
heroku run rails db:migrate
特殊情况处理:如果执行上述步骤后仍然报错,可以先查看迁移状态:
heroku run rails db:migrate:status,如果AddActivationToUsers对应的迁移状态显示为up,说明之前失败的迁移被异常标记为已执行,先执行heroku run rails db:rollback STEP=1回滚该迁移,再重新执行迁移命令即可。这种情况在PG环境下概率极低,仅在非事务性迁移场景才会出现。
内容的提问来源于stack exchange,提问作者Akylbek
相关产品推荐
相关产品推荐

