部署带独立队列数据库的Rails 8应用到Heroku报错:solid_queue_jobs关系不存在
解决Rails 8多数据库Heroku部署SolidQueue表不存在问题
问题根源
- 数据库配置复用错误:当前配置复用了
primary_production锚点,导致所有数据库都继承DATABASE_URL,实际指向同一个primary数据库,而非独立实例。 - SolidQueue未绑定指定数据库:SolidQueue默认使用Rails的primary数据库,但你期望它用独立的
queue数据库,且未在该库执行SolidQueue迁移。 - Heroku多数据库环境变量缺失:Heroku默认仅提供一个数据库实例,额外数据库需单独添加并配置对应环境变量。
修复步骤
1. 修正config/database.yml配置
移除对primary锚点的复用,为每个数据库配置独立环境变量:
production: primary: &primary_production <<: *default database: app_production url: <%= ENV['DATABASE_URL'] %> cache: <<: *default database: app_production_cache url: <%= ENV['CACHE_DATABASE_URL'] %> migrations_paths: db/cache_migrate queue: <<: *default database: app_production_queue url: <%= ENV['QUEUE_DATABASE_URL'] %> migrations_paths: db/queue_migrate cable: <<: *default database: app_production_cable url: <%= ENV['CABLE_DATABASE_URL'] %> migrations_paths: db/cable_migrate
2. 在Heroku添加额外数据库实例
通过Heroku CLI为每个独立数据库添加Postgres附加组件:
# 添加队列数据库 heroku addons:create heroku-postgresql:standard-0 --app your-app-name --name queue-db # 添加缓存数据库 heroku addons:create heroku-postgresql:standard-0 --app your-app-name --name cache-db # 添加Cable数据库 heroku addons:create heroku-postgresql:standard-0 --app your-app-name --name cable-db
将Heroku自动生成的数据库URL映射到配置的环境变量(替换<COLOR>为Heroku返回的数据库标识,如BLUE、GREEN):
heroku config:set QUEUE_DATABASE_URL=$(heroku config:get HEROKU_POSTGRESQL_<COLOR>_URL) --app your-app-name heroku config:set CACHE_DATABASE_URL=$(heroku config:get HEROKU_POSTGRESQL_<COLOR>_URL) --app your-app-name heroku config:set CABLE_DATABASE_URL=$(heroku config:get HEROKU_POSTGRESQL_<COLOR>_URL) --app your-app-name
3. 配置SolidQueue使用queue数据库
在config/solid_queue.yml中指定数据库连接:
production: dispatchers: default: database: queue processors: default: database: queue queues: background: database: queue
或者在config/initializers/solid_queue.rb中配置:
SolidQueue.configure do |config| config.database = :queue end
4. 生成并执行对应数据库的迁移
将SolidQueue迁移文件生成到queue数据库的迁移路径:
rails generate solid_queue:install --database queue
在Heroku上分别执行各数据库的迁移:
# Primary数据库迁移 heroku run rails db:migrate --app your-app-name # Cache数据库迁移 heroku run rails db:migrate:cache --app your-app-name # Queue数据库迁移(包含SolidQueue表) heroku run rails db:migrate:queue --app your-app-name # Cable数据库迁移 heroku run rails db:migrate:cable --app your-app-name
5. 验证部署
启动Heroku控制台测试任务入队:
heroku run rails console --app your-app-name # 执行测试任务 GuideSearchIndexJob.perform_later
注意事项
- 确保Heroku附加数据库的层级与应用需求匹配(如开发用免费层级,生产用标准层级)。
- Rails 8中需为每个数据库配置合理的
pool大小,避免连接池耗尽。 - 若使用SolidQueue的Web UI,需确保其也指向
queue数据库。
内容的提问来源于stack exchange,提问作者karns
相关产品推荐
相关产品推荐

