Rails 7本地回滚数据库后服务器数据库未更新问题
问题解决步骤
1. 确认服务器已执行的迁移版本
登录服务器,进入当前部署的应用目录,启动生产环境控制台:
cd /path/to/your/app/current rails c production
在控制台中查询已执行的迁移版本:
ActiveRecord::Base.connection.execute("SELECT version FROM schema_migrations").to_a
将结果与本地db/migrate/目录下的最新迁移文件版本号对比(文件名开头的时间戳即为版本号)。
2. 处理重复/已记录的迁移版本
如果服务器的schema_migrations表中已经存在你重新生成的迁移版本号,Rails会判定该迁移已执行,不会重复运行。此时有两种处理方式:
方式一:回滚旧迁移后重新执行
在服务器的应用目录下执行回滚命令(替换OLD_VERSION为旧迁移的版本号):
rails db:rollback VERSION=OLD_VERSION production
然后执行最新迁移:
rails db:migrate production
方式二:手动移除已记录的版本后执行迁移
在生产环境控制台中删除对应版本的记录(替换OLD_VERSION):
ActiveRecord::Base.connection.execute("DELETE FROM schema_migrations WHERE version = 'OLD_VERSION'")
退出控制台后执行迁移:
rails db:migrate production
3. 验证部署与权限问题
- 确认服务器当前release目录下的
db/migrate/文件是最新版本,避免部署时分支错误或缓存导致文件未更新。 - 检查生产环境SQLite数据库文件的权限:
ls -l /path/to/your/app/current/db/production.sqlite3
确保运行Rails的用户(如deploy用户)拥有该文件的读写权限。
4. 查看Capistrano迁移日志
执行带trace参数的迁移命令,排查执行过程中的错误:
cap production deploy:migrate --trace
根据日志中的错误信息(如权限不足、迁移文件语法错误等)针对性解决。
内容的提问来源于stack exchange,提问作者John Sall
相关产品推荐
相关产品推荐

