2008-10-24 66 views
4

我有两台机器......一台开发机器和一台生产机器。当我第一次将我的Rails应用程序带到生产服务器上时,我没有任何问题。我只需通过运行rake db导入schema.rb:schema:load RAILS_ENV = production。一切都好。为什么Rake会抛出这个Rails迁移错误?

因此,在我的开发机器上,我做了一些更改和另一次迁移,然后将新应用程序复制到生产计算机上。然后我尝试通过运行rake db来更新数据库:migrate RAILS_ENV = production。我收到以下错误: “数据库中已经有一个名为'schema_migrations'的对象。”

我在想我自己,雅没有开玩笑耙......你创造了它!我在耙子上跑过痕迹,好像耙子认为这是它第一次跑步。但是,通过分析我的开发计算机和生产计算机上的'schema_migrations'表,可以看到一个迁移有差异,即我想要迁移的迁移。

我也试着明确定义版本号,但这也不起作用。

关于如何让我的生产服务器保持最新的任何想法?

更新:

让我说开始,我不能只是“降”的数据库。这是一个已经有超过10万条记录的生产服务器。如果将来出现类似问题会发生什么?我每次发生数据库问题时都会丢掉表格?这次可能会起作用,但对于每个数据库问题来说,它似乎都不是一个实用的长期解决方案。我怀疑我现在遇到的问题对我来说是独一无二的。

  1. 听起来像'schema_info'表和'schema_migrations'表是相同的。在我的设置中,我只有'schema_migrations'。如前所述,生产服务器上的'schema_migrations'表与开发计算机之间的差异只是一个记录。也就是说,包含我想要迁移的更改版本号的记录。

  2. 从我读过的'Simply Rails 2'一书中,它指出,当第一次移动到生产服务器时,不应运行rake db:migrate,而应该运行rake:db:schema:load。

  3. 如果有关系,我使用的是Rails版本2.1。

回答

1

这是一个猜测,我承认:我想是因为你第一次运行分贝:模式:负载,而不是分贝:迁移在生产环境中,你有你的数据库的结构,而不是数据迁移填充到您的schema_info表中。因此,现在,当您在生产环境中运行迁移时,schema_info中没有数据,这就是为什么迁移认为它尚未运行(因为尚未运行)的原因。这就是说......你说你看过“schema_migrations”表,并且从开发到生产有一个版本是有区别的......我还没有听说过那张表,在我的rails版本后面几个月。也许你可以尝试在生产环境中创建一个“schema_info”表格,并在单个“版本”列中添加一行,并添加一个相信你的生产环境的版本。

+0

是的,schema_migrations表是您的密钥,它可能不在那里或者没有填充或生产服务器上的东西 – 2008-10-25 04:36:17

0

我只想删除数据库,再次添加它并运行rake rb:migrate。Brad是正确的,当你运行模式加载时,它没有在schema_migrations表中放置任何记录。

当然,如果在生产服务器上有不能丢失的数据,这当然会更复杂。你可以得到rake备份任务(不知道这是否是核心的一部分),然后在生产数据库上运行rake db:backup:write,然后在生产中获得最新的迁移之后,运行rake db:备份:阅读。

+0

如果这是真的,或者最佳路径,则不会对生产系统进行更改,在现实生活中几乎总是有数据需要维护:) – 2008-10-25 03:34:39

+0

我是只推荐它,因为他第一次没有正确运行迁移。 – 2008-10-27 13:58:18

-1
rake db:migrate RAILS_ENV=production 

仅在第一次创建时使用db:schema:load任务,应该迁移增量更改。

1

关于你提到的更新:

  1. 我不明白有什么区别你的生产schema_migrations和开发人员版之间。两个表中是否有记录(应该只有一列,“版本”,右)还是在开发数据库中有单个记录,生产中是否有零记录?如果存在零个记录生产表,那么这样做:

    ActiveRecord::Base.connection.execute("INSERT schema_migrations (version) VALUES(#{my version number that production is supposedly on})")

  2. 或者,你可以尝试对生产完全丢弃schema_migrations表:

    ActiveRecord::Base.connection.execute("DROP TABLE schema_migrations")

    然后,再运行rake db:migrate RAILS_ENV=production。这将从版本1开始进行迁移,这可能不是你想要的。

  3. 或者,您可以在您的生产环境中启动IRB会话,执行要求加载的迁移文件的“require”或“load”(我永远不会记住它是哪一个或哪一个很重要) ,然后致电MyMigrationClass.up。之后,您需要在schema_migrations表中手动设置版本号,因为您仍然会遇到问题,但作为快速修复类型的黑客,这可行。

1

如果您得到“在数据库中已经有一个名为'schema_migrations'的对象。”错误消息,那么我怀疑你是使用MS SQLServer作为你的数据库? (因为这看起来像MS SQL Server错误信息)

如果是,那么你使用哪个ActiveRecord数据库适配器? (什么是你的database.yml文件,你安装了什么宝石来访问MS SQL Server数据库?)

目前看来,Rails没有在生产架构中找到schema_migrations表,因此试图创建它,并且此创建失败数据库错误消息。可能原因是schema_migrations表名中的大写/小写字符 - 据我了解,MS SQL Server标识符区分大小写。

0

schema_info来自老版本的Rails。 schema_migrations是块上的新小孩。您应该能够移除schema_info表,因为它不再被使用。您可能需要搜索与此名称更改相关的任何问题。

0

rake db:schema:load将从schema.rb加载数据库结构。该文件是数据库结构的当前表示。当您有一个需要创建所有表和索引的空模式(数据库)时使用它。它可以节省你不得不运行所有的迁移。如果您有一个包含数据的现有生产数据库,则不需要运行它。正如其他人所说,这将是不好的!

1

取决于生产中所使用的系统上,我所看到的情况,其中低于不工作:

rake db:migrate RAILS_ENV=production 

但是,在这一个没有问题:

RAILS_ENV=production rake db:migrate 

有些古怪,我知道,但值得尝试一下,看看它是否有所作为。

0

我知道这篇文章是前段时间,但我偶然发现它,它并没有真正回答。当它出现在谷歌,这里。

当您执行了rake db:schema:dump(或者这是由构建脚本为您完成的)时,它会将迁移表的定义放入schema.rb中。在脚本结尾处,进程将尝试再次创建表,但它显然已经存在。在运行rake:schema:load之前,只需从schema.rb中删除迁移表,并且不会有错误消息。

您需要在迁移表中设置版本号,以便随后运行迁移。因此,了解schema.rb的相关版本很重要,或者删除所有旧的迁移(它们在您的SCM中是安全的吗?)

相关问题