Railway部署Rails应用遇ActiveRecord::PendingMigrationError,求自动迁移方案
解决Railway部署Rails时自动执行数据库迁移的问题
核心问题说明
你之前在本地执行RAILS_ENV=development相关命令没用,是因为Railway部署的是生产环境(production),和本地开发环境完全独立,而且Railway默认用PostgreSQL作为生产数据库,和你本地的SQLite不是同一个数据库——本地操作根本影响不到部署后的服务器数据库。
自动执行迁移的具体方案
方法1:修改Railway的启动命令(最直接有效)
Railway允许自定义应用启动时执行的命令,把迁移操作和启动服务器的命令绑定在一起即可:
- 打开你的Railway项目控制台
- 进入「Settings」→「Start Command」
- 将默认启动命令替换为:
这样每次部署时,Railway会先执行数据库迁移,再启动Rails服务器,不会再出现迁移待处理的错误。bin/rails db:migrate && bin/rails server -p $PORT
方法2:使用Build Command(可选,不优先推荐)
如果需要在构建阶段执行操作,也可以在「Settings」→「Build Command」中添加迁移命令,但更推荐用启动命令——因为构建阶段数据库可能还未就绪,容易出现连接问题。
额外注意事项
- 生产环境不要用SQLite:Railway生产环境默认用PostgreSQL,只需在
Gemfile中配置如下,Rails会自动适配:gem 'pg', group: :production gem 'sqlite3', group: :development - 无需删除本地SQLite文件:本地数据库和Railway的数据库完全独立,删除本地文件解决不了部署问题。
- 本地可模拟生产环境测试迁移:执行
RAILS_ENV=production bin/rails db:migrate,不过本地生产环境用的还是SQLite,和Railway的PostgreSQL可能存在小差异,基础迁移一般不会有问题。
验证生效方式
修改启动命令后,推送一次代码触发重新部署,查看Railway的日志,如果看到类似Migrating to CreateContacts (20221102234102)的内容,说明迁移已自动执行成功,应用也能正常启动。
内容的提问来源于stack exchange,提问作者ThomasGuaetta
相关产品推荐
相关产品推荐

