部署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
相关产品推荐
相关产品推荐

