ruby-on-rails - Rails pg 数据库:schema_migrations 为空
问题描述
我正在尝试将项目的新版本部署到我的登台服务器,但数据库中的 schema_migrations 表莫名其妙地为空。
它现在正在尝试在部署时运行所有迁移,由于其他表存在并且完好无损,因此会导致问题。
与其删除/重新创建数据库并丢失我的所有数据(虽然不方便,但这是一个有效的选项),是否可以在不删除的情况下生成 schema_migrations 表?
解决方案
两点:
删除不再需要的迁移并没有错,您不应该永远保留它们。
如果需要,您可以手动更新
schema_migrations
表格。
就(1)而言,我删除了超过一个月左右的迁移(假设它们已在任何地方应用)。保持多年的混乱db/migrate
是没有意义的。除了最近的迁移之外,向下迁移然后备份往往比它的价值更混乱;如果您需要测试旧的东西,请转储您当前的开发数据库并从一个新的基于旧的schema.rb
. db/schema.rb
此外,如果你真的需要一个旧的迁移,那么你总是可以将它从版本控制中挖掘出来,或者只是根据(or db/structure.sql
)版本之间的差异重新创建它。
当然,如果你不保持db/schema.rb
修订控制,那么你做错了,你手上的灾难迫在眉睫。
对于(2),schema_migrations
表格非常简单:
create table schema_migrations (
version varchar not null primary key
)
因此,您可以使用 连接到 PostgreSQL psql
,手动创建表,然后执行一系列操作insert into schema_migrations (version) values (...)
来覆盖应该在您的登台环境中运行的历史迁移,然后db:migrate
照常更新。然后,您可以花费尽可能多的时间进行事后分析,以找出暂存数据库的schema_migrations
表发生了什么。
ar_internal_metadata
如果你走这条路,如果你的 Rails 版本使用它,你可能想看看这个表。
当然,您将在执行任何操作之前备份您的临时数据库。您将需要检查您的生产数据库以确保它没有遇到同样的问题。
有时你必须弄脏你的手才能让事情顺利进行。
推荐阅读
- c# - 从 ac# _context 获取匹配值并更新匹配字段
- kubernetes - 有没有办法备份/恢复/升级 Minikube 集群的无状态部分?
- redis - Redis 更新排序集中的所有分数
- node.js - 无法在 MAC 中卸载/更新 Angular Cli
- android - Jetpack 在灯光模式下撰写动画错误
- javascript - 如何在不支持值时声明带有后备的 CSS 值
- r - Rpubs包的R函数rpubs_code无法从Rpubs文章中提取代码
- javascript - 如何将“关键帧”css 应用于 React 组件中的特定类?
- spring-boot - 无法启动网络服务器;嵌套异常是 org.springframework.boot.web.server.WebServerException
- python - NamedTemporaryFile() 用于在烧瓶 send_file 之后清除文件