部署到Heroku的Rails应用运行db:seed无法填充Hobbydev版Postgres数据库
1. 首先查看seed执行的实际报错
执行带trace的seed命令输出完整运行日志,定位失败原因:
heroku run rails db:seed --trace
绝大多数静默失败的问题都可以通过错误日志直接定位。
2. 检查Faker gem的依赖配置
这是最常见的问题:很多开发者会把faker gem错误放到Gemfile的development/test分组中,Heroku生产环境部署时默认不会安装该分组的依赖,运行seed时调用Faker相关方法直接报错失败。
请确认你的Gemfile中gem 'faker'的声明不在分组限制内,如果之前放在开发测试组,调整后重新提交代码部署到Heroku再尝试跑seed。
3. 检查关联用户是否存在
你的种子代码硬编码了user_id: 2,而Rails 5+版本中belongs_to :user默认开启关联存在校验,只要生产环境不存在id为2的用户,所有Article创建都会直接失败。
可以先登录Heroku的控制台确认用户是否存在:
heroku run rails c # 进入控制台后执行 User.find_by(id: 2)
如果返回nil,说明没有对应用户,你可以先在种子文件中先创建对应id的用户,或者调整种子代码的user_id为生产环境实际存在的用户id。
4. 替换create为create!抛出明确异常
你当前使用的Article.create方法在验证失败、关联校验失败时只会返回false,不会抛出异常,你看不到任何提示就会误以为种子命令没生效。
可以临时把种子文件里的Article.create全部替换为Article.create!,再跑seed命令就会直接抛出具体的失败原因,比如验证不通过、关联不存在、缺少字段等。
5. 确认所有迁移已正常执行
你在Article模型中使用了has_rich_text :body,依赖Action Text对应的action_text_rich_texts表,需要确认生产环境所有迁移都已执行完成:
heroku run rails db:migrate:status
如果有迁移状态为down,先执行heroku run rails db:migrate跑完所有迁移再试seed。
关于重置生产数据库
如果确认生产环境没有需要保留的重要数据,可以执行重置操作,但这不是必要操作,优先排查完上述问题再考虑:
# 注意:该命令会清空生产环境所有数据 heroku run rails db:reset
内容的提问来源于stack exchange,提问作者jbeachy

