首页 > 解决方案 > Rails pg 数据库:schema_migrations 为空

问题描述

我正在尝试将项目的新版本部署到我的登台服务器,但数据库中的 schema_migrations 表莫名其妙地为空。

它现在正在尝试在部署时运行所有迁移,由于其他表存在并且完好无损,因此会导致问题。

与其删除/重新创建数据库并丢失我的所有数据(虽然不方便,但这是一个有效的选项),是否可以在不删除的情况下生成 schema_migrations 表?

标签: ruby-on-railspostgresql

解决方案


两点:

  1. 删除不再需要的迁移并没有错,您不应该永远保留它们。

  2. 如果需要,您可以手动更新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 版本使用它,你可能想看看这个表。

当然,您将在执行任何操作之前备份您的临时数据库。您将需要检查您的生产数据库以确保它没有遇到同样的问题。

有时你必须弄脏你的手才能让事情顺利进行。


推荐阅读