【问题标题】:exactly what does rake db:migrate do?rake db:migrate 到底是做什么的?
【发布时间】:2010-11-03 16:17:42
【问题描述】:

rake db:migrate 是只添加新的迁移,还是放弃所有迁移/更改并构建所有新的东西?

我认为 rake 抛出错误,因为它试图访问迁移 040 中的表属性,该属性在迁移 042 中被删除。不知何故,我的数据库和 rake 不同步,我想修复它们。

对于你们那里的专家 - rake 与迁移不同步是否很常见?我怎样才能避免这种情况(不,我不会手动编辑架构或 rake 文件)。

【问题讨论】:

    标签: ruby-on-rails migration rake


    【解决方案1】:

    迁移意味着您从当前版本迁移到更新版本(如第一个答案中所述)。使用 rake db:migrate 您可以将任何新更改应用于您的架构。但是,如果您想回滚到以前的迁移,您可以使用 rake db:rollback 来取消您的新更改(如果它们定义不正确)。注意:这样做会丢失您的数据。

    【讨论】:

      【解决方案2】:

      当您使用 rails 迁移时,会自动创建一个名为 schema_migrations 的表,该表通过存储每个迁移的版本号(这是文件中迁移名称前面的数字)来跟踪已应用的迁移名称,即 db/migrate/_20090617111204__migration.rb)。当您运行rake db:migrate 向上迁移时,只会运行以前没有运行过的迁移(即它们的版本不包含在表中)(因此,更改已经执行的迁移将没有效果运行db:migrate)。向下迁移时,在schema_migrations 中找到的大于您要回滚到的版本的所有版本都将被撤消。

      【讨论】:

      • 谢天谢地,这个答案为我提供了更多细节。为什么 db:migrate 文档中的任何地方都没有 schema_migrations?这是我对系统理解的缺失部分,即 rails 如何“确定应该运行哪些迁移”!
      【解决方案3】:

      每次您使用脚本(如脚本/生成模型...)创建迁移时,都会将新的迁移添加到准备好与真实数据库同步的正确目录中。

      实际上 rake db:migrate 只是检查哪些丢失的迁移仍然需要应用于数据库,而不关心之前的迁移。

      当然,如果您使用其他方式修改数据库通常会获得不同步的内容,因为正如您所说,您会发现自己将迁移应用到下面更改的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        • 2013-09-02
        • 2014-01-02
        • 2013-10-10
        • 2017-05-08
        • 2022-01-20
        相关资源
        最近更新 更多