丢了我的schema.rb!可以再生吗?


133

由于某些部署问题,我停止了在git中跟踪schema.rb。不知何故,我已将其填充到schema.rb文件消失的途中。

有没有一种方法可以从数据库或迁移中重新生成schema.rb?我希望不要丢失现有数据。

Answers:


230

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

bundle exec rake db:schema:dump

非常感谢,有很多答案,但看起来您是第一个(只是),所以为您打勾。很好奇,这是从数据库本身还是从迁移生成模式?
布拉德(Brad)2012年

7
从数据库本身,因此请注意是否在迁移之外发生了更改。
mguymon'3

1
schema.rb rake db:schema:dump在Rails 2.0 之后仍然包含空模式
Will Hardwick-Smith

运行上述命令后,我的schema.rb文件仍然完全相同
stevec

59

小心,

rake db:schema:dump

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

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

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

1
这将导致数据丢失,OP表示希望避免。此外,正如Colin所指出的那样,纯粹由于迁移而重新生成数据库可能是一个非常糟糕的主意,因为增加了遇到奇怪的依赖问题的可能性(通常来说)。如果有挂起的迁移,最好在开发机器上运行这些最后的迁移,然后运行rake db:schema:dump命令。
Paul Richter 2014年

4
我的回答中清楚地解释了每个画布。我只通过运行schema:dump而没有得到一个干净的模式就完全被咬了。OP正在谈论在CVS中跟踪架构。我想让自己的架构与迁移中的定义保持一致,而不要与生产数据库或旧开发数据库中的过时版本保持一致
gamov 2014年

11
rake db:schema:dump

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


8

铁路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文件,您就可以保持良好状态!


4

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

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

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


如果在重新生成架构之前在开发计算机上有任何未完成的迁移,则可能要运行最后几个挂起的迁移,但是是的,纯粹从迁移中重新生成数据库是一个非常糟糕的主意,尤其是因为这会导致数据丢失。
Paul Richter 2014年

1

我也遇到了类似的问题,即使删除了迁移,我的旧架构也无法刷新。

因此,我要做的是删除数据库中所有现有的表,然后再次迁移它们。然后运行“ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.