【问题标题】:Lost my schema.rb! Can it be regenerated?丢失了我的 schema.rb!可以再生吗?
【发布时间】:2012-03-16 03:48:59
【问题描述】:

由于一些部署问题,我停止在 git 中跟踪 schema.rb。不知何故,我把它塞进去了,而且我的 schema.rb 文件消失了。

有没有办法从数据库或迁移中重新生成 schema.rb?我不希望丢失现有数据。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 git


    【解决方案1】:

    如果您运行rake -T,它将列出您的 Rails 项目的所有可能的 rake 任务。其中之一是 db:schema:dump,它将从数据库中为 Rails 应用程序重新创建 schema.rb。

    bundle exec rake db:schema:dump
    

    【讨论】:

    • 非常感谢,很多答案,但看起来你是第一个(只是)所以为你打勾。只是好奇,这是从数据库本身还是从迁移生成架构?
    • 来自数据库本身,因此如果在迁移之外发生了更改,请小心。
    • schema.rb 在 rails 2.0 上的 rake db:schema:dump 之后仍然包含空模式
    • 我的 schema.rb 文件在运行上述命令后保持不变
    【解决方案2】:

    小心,

    rake db:schema:dump
    

    将转储当前的数据库架构从数据库。这意味着,如果您对迁移进行了任何更改,它们将不会反映在 schema.rb 文件中,这不是您想要的 IMO。

    如果您想从迁移中重新创建架构,请执行以下操作:

    rake db:drop  # ERASES THE DATABASE !!!! 
    rake db:create
    rake db:migrate
    

    【讨论】:

    • 这将导致数据丢失,OP 表示他们希望避免这种情况。此外,正如 Colin 指出的那样,纯粹从迁移中重新生成数据库可能是一个非常糟糕的主意,因为遇到奇怪的依赖问题的可能性增加(一般来说)。如果有挂起的迁移,最好在开发机器上运行最后的迁移,然后运行rake db:schema:dump 命令。
    • 我的回答中清楚地解释了每个画布。只运行 schema:dump 而没有得到干净的模式,我已经完全被咬了。 OP 正在谈论跟踪 CVS 中的模式。我希望我的架构与我在迁移中的定义保持一致,而不是生产数据库或旧开发数据库中的过时版本
    【解决方案3】:
    rake db:schema:dump
    

    我认为这在 Rails 3 中仍然有效 - 它从数据库中重新生成 schema.rb。

    【讨论】:

      【解决方案4】:

      RAILS 5 路:

      rails db:schema:dump
      

      或者如果你遇到 Gem::LoadError 那么:

      bundle exec rails db:schema:dump
      

      注意:

      在 Rails 5 中,建议使用rails 而不是rake 生成/执行任务,这只是为了记住,rails 生成的任务扩展名为.rake,参见lib/tasks/myTask.rake。这意味着这些任务也可以通过添加rake来执行。

      【讨论】:

        【解决方案5】:

        如果你在本地重新生成schema.rb,你应该没问题。它只是保存数据库表结构的表示。数据本身不包含在此文件中。

        要重新生成您的 schema.rb 文件,请运行:

        bundle exec rake db:schema:dump
        

        然后只需提交新的schema.rb 文件,您应该状态良好!

        【讨论】:

          【解决方案6】:

          直接来自 schema.rb 文件本身:

          如果您需要在另一个上创建应用程序数据库 系统,您应该使用db:schema:load,而不是运行所有迁移 从头开始。后者是一种有缺陷且不可持续的方法(迁移越多 你会积累,它运行得越慢,出现问题的可能性就越大)。

          因此,请勿执行 rake db:migrate 的建议,这是在撰写本文时 - 评分最低的答案中建议的。

          【讨论】:

          • 在重新生成架构之前,如果您的开发机器上有任何未决迁移,您可能希望运行最后几个未决迁移,但是是的,纯粹从迁移中重新生成数据库是一个非常糟糕的主意,尤其是因为会导致数据丢失。
          【解决方案7】:

          我也有类似的问题,即使我删除了迁移,我的旧架构也没有刷新。

          所以,我所做的是删除数据库中所有现有的表并再次迁移它们。然后运行“db:schema:load”命令给了我一个新的 schema.rb。

          drop table my_table_name // deleted them individually
          rake db:migrate
          rake db:schema:dump // re-created a new schema
          

          【讨论】:

            猜你喜欢
            • 2020-10-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-26
            相关资源
            最近更新 更多