You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署Rails项目到Heroku时遇active_storage_attachments表不存在错误求助

解决ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: relation "active_storage_attachments" does not exist) 错误

你已经做了不少基础排查,咱们再一步步梳理下可能漏掉的细节,帮你搞定这个问题:

1. 先确认Heroku上的ActiveStorage迁移真的执行成功了

很多时候本地操作没问题,但Heroku这边要么没拿到迁移文件,要么迁移没跑起来:

  • 先检查本地Git仓库里有没有ActiveStorage的迁移文件(路径一般是db/migrate/[一串时间戳]_create_active_storage_tables.rb),如果没有,重新跑rails active_storage:install,然后把生成的文件提交到Git再推送到Heroku。
  • 登录Heroku手动执行迁移:
    heroku run rails db:migrate
    
  • 验证数据库里是否真的有这两张表:
    heroku run rails console
    # 在控制台里输入这两行,看返回是不是true
    ActiveRecord::Base.connection.table_exists?('active_storage_attachments')
    ActiveRecord::Base.connection.table_exists?('active_storage_blobs')
    

如果返回false,说明迁移没成功,去看看迁移日志找原因:

heroku logs --tail | grep migrate

2. 检查ActiveStorage的生产环境配置是否生效

虽然你说已经配置了S3,但得确保Heroku环境下配置是对的:

  • 打开config/environments/production.rb,确认有这行配置:
    config.active_storage.service = :amazon
    
  • 检查config/storage.yml里的S3配置是否正确,比如bucket名、region这些有没有写错。
  • 确认Heroku的环境变量已经设置了S3的密钥:
    heroku config
    

要是缺了AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION、AWS_BUCKET这些变量,用命令补上:

heroku config:set AWS_ACCESS_KEY_ID=你的密钥ID AWS_SECRET_ACCESS_KEY=你的密钥 AWS_REGION=你的区域 AWS_BUCKET=你的桶名

3. 排查迁移顺序的坑

如果你的某个模型迁移文件(比如用到has_one_attached的模型)的时间戳比ActiveStorage的迁移文件早,那跑迁移的时候就会因为找不到表而失败:

  • 调整迁移文件的时间戳,把ActiveStorage的迁移文件放在所有用到它的模型迁移前面,然后重新在Heroku上执行:
    heroku run rails db:migrate:redo
    
  • 或者先回滚到ActiveStorage迁移之前的版本,再重新跑所有迁移:
    heroku run rails db:rollback TO=[ActiveStorage迁移文件时间戳减1的那个版本号]
    heroku run rails db:migrate
    

4. 终极方案:彻底重建Heroku数据库(谨慎操作!)

如果上面的方法都没用,那可以试试彻底重置数据库(注意:这会清空所有数据,一定要确认数据已经备份):

heroku pg:reset DATABASE
heroku run rails db:migrate
# 如果需要初始化种子数据,再跑下面这行
heroku run rails db:seed

内容的提问来源于stack exchange,提问作者Pablo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:26:35