具有现有数据库的 Rails 一直说迁移未决

Posted

技术标签:

【中文标题】具有现有数据库的 Rails 一直说迁移未决【英文标题】:Rails with existing database keeps saying migration pending 【发布时间】:2013-11-06 16:19:35 【问题描述】:

我正在尝试使用现有数据库创建一个新的 Rails 项目。

我创建了项目,配置了 database.yml 并且可以成功地做一个 db:schema:dump

这一切都是基于我在这个网站上阅读的内容

http://blog.joelberghoff.com/2013/02/06/ruby-on-rails-tutorial-creating-a-rails-instance-from-an-existing-mysql-db/

还有一些其他的。

完成转储后,我将 schema.rb 复制到 db/migrate 并重命名为 001_createdatabase.rb,如他的教程中所示。

一切似乎都很好。但是我无法运行该站点,因为它告诉我我有待处理的迁移。并且 db:migrate:status 表示它是我创建的 001_createdatabase.rb。

所以基于此:

从 schema.rb 创建 001_createdatabase 迁移是否正确? 如果是这样,我如何让 rails 了解它不需要像已经完成的那样运行那个? rails 在哪里检查它是否有挂起的迁移。显然它必须检查 db/migrate 文件夹并将其与什么进行比较?

谢谢

【问题讨论】:

【参考方案1】:

看来,为了获得运行迁移的功劳,您需要实际运行迁移。迁移001_createdatabase.rb, 表示将带您从空数据库(没有表,没有数据)到拥有数据库的第一个版本的迁移。当您运行rake db:migrate 时,rails 通过在 schema_migrations 表中查找迁移文件名的数字部分来检查 db/migrate 目录中的每个文件是否已运行。

在您的情况下,您没有运行迁移,schema_migrations 表中没有条目,因此 rails 认为,正确地,有一个迁移要运行。

要解决此问题,您可以将已运行迁移的记录放入 schema_migrations 或实际运行迁移。您可能需要创建 schema_migrations 表,rails 会根据需要创建它。

如果你想运行迁移,要么删除你的数据库(或者创建一个新的——你可以删除旧的),然后将你的 Rails 应用程序指向新的数据库。运行rake db:createrake db:migrate。完成后,您应该拥有数据库的新副本,但该副本是由 rails 迁移过程创建的。 schema_migrations 表应该有一条 version 列为 1 的记录。

【讨论】:

谢谢。布局很好:)

以上是关于具有现有数据库的 Rails 一直说迁移未决的主要内容,如果未能解决你的问题,请参考以下文章

如何从现有迁移文件中删除脚本 rails

Rails迁移以将主键添加到现有表

如何通过 Rails 迁移克隆数据库表?

是否有任何与 rails ActiveRecord 迁移相当的 Firestore 数据库模式迁移概念?

Laravel 迁移:添加具有现有列默认值的列

如何使用 SSMA(用于访问 SQL Server)将具有不同列的表迁移到现有表中?