Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我的rails迁移赢得了';我跑不了,我也跑不了;不要部署我的rails应用程序。我怎样才能重新开始?_Ruby On Rails_Ruby_Database_Schema_Migration - Fatal编程技术网

Ruby on rails 我的rails迁移赢得了';我跑不了,我也跑不了;不要部署我的rails应用程序。我怎样才能重新开始?

Ruby on rails 我的rails迁移赢得了';我跑不了,我也跑不了;不要部署我的rails应用程序。我怎样才能重新开始?,ruby-on-rails,ruby,database,schema,migration,Ruby On Rails,Ruby,Database,Schema,Migration,在rails开发的某个阶段,我开始在不使用rails迁移的情况下进行数据库更改(例如删除或更改列/表)。所以现在,当我尝试从头开始部署rails应用程序时,会出现错误 blaine@blaine-laptop ~/tmp/rbjacolyte $ rake db:migrate (in /home/blaine/tmp/rbjacolyte) == AddHashToTrack: migrating ===============================================

在rails开发的某个阶段,我开始在不使用rails迁移的情况下进行数据库更改(例如删除或更改列/表)。所以现在,当我尝试从头开始部署rails应用程序时,会出现错误

blaine@blaine-laptop ~/tmp/rbjacolyte $ rake db:migrate
(in /home/blaine/tmp/rbjacolyte)
==  AddHashToTrack: migrating =================================================
-- add_column(:tracks, :hash, :string)
rake aborted!
An error has occurred, all later migrations canceled:

Mysql::Error: Table 'jacolyte_dev_tmp.tracks' doesn't exist: ALTER TABLE `tracks` ADD `hash` varchar(255)

(See full trace by running task with --trace)
在我使用原始SQL将生产和开发环境搞砸之后,如何将其与迁移同步?我希望部署rails应用程序时不会出现数据库错误,也不希望从头开始

blaine@blaine-laptop ~/tmp/rbjacolyte $ rake db:migrate
(in /home/blaine/tmp/rbjacolyte)
==  AddHashToTrack: migrating =================================================
-- add_column(:tracks, :hash, :string)
rake aborted!
An error has occurred, all later migrations canceled:

Mysql::Error: Table 'jacolyte_dev_tmp.tracks' doesn't exist: ALTER TABLE `tracks` ADD `hash` varchar(255)

(See full trace by running task with --trace)

生产和开发环境中的数据匹配,但迁移失败。我想要一种“从头开始”的方式


我可以简单地删除我所有的迁移,然后从现在开始使用迁移吗?

如果现有的生产数据与开发数据库模式兼容,那么我会:

  • 使用诸如
    mysqldump
  • 删除生产数据库
  • 重新创建生产数据库
  • 对生产数据库运行迁移,指定版本=0
  • 从第一步创建的文件导入生产数据

  • 如果模式不兼容,那么您可能可以遵循此过程,但您必须编辑在第一步中创建的文件中的SQL,以考虑模式差异。

    也许您可以摆脱当前的所有迁移,并使用
    rake db:schema:dump
    创建一个新的schema.rb文件,手动编辑您的生产数据库以反映到目前为止所做的更改?

    我喜欢Veeti的建议,并进行了修改:rake db:schema:dump,然后将该文件移动到您的开发机器上。到目前为止,请扁平化Rails迁移(请参阅),去掉大部分迁移,并根据新的模式重新进行迁移


    让它在您的开发人员机器上运行,提交并部署。

    快捷方式:手动向schema_迁移添加一个表示基线的时间戳条目。您可以在这之后添加迁移,只要它们没有对db模式做出任何错误的假设,它们就应该能够正常运行。您将无法向后迁移,但这不是一个大问题

    更大的问题是,你将无法从零开始制作分贝,这将是一个长期的痛苦

    解决方法是删除所有现有迁移,并创建一个新迁移来创建现有模式。手动删除schema_migrations表中的所有内容,并为这一次新迁移输入一个条目。在这之后,您可以创建基于这个新基线的新迁移,它们应该可以很好地应用。您应该能够以正常方式引导新数据库

    只要直接SQL包含在Rails迁移中,使用它就没有问题。只要确保你实施了“向上”和“向下”两种方法,你就应该表现得很好。实际上,我们已经开始使用原始SQL作为最佳实践,以避免以后更改模型时出现问题。差不多

    Foo.create(:name => 'bar')
    
    在用户模型修改为

    validates_presence_of :baz
    
    此时,新迁移将针对现有数据库运行,但创建表并添加虚拟项的早期迁移将失败,因为用户验证失败。只是使用

    execute("insert into foos (name) values ('bar')")
    

    只要以后的迁移正确地填充了它们添加的任何新列,就可以正常工作。

    生产和开发中的数据彼此兼容。另一个问题是,迁移不会在生产或开发环境中运行,因为我已经使用原始SQL或Sequel ORM进行了很多更改。可以说,我只想找到一种“从头开始”的方法。迁移与数据库不同步。例如,迁移运行但失败,因为我将删除带有原始SQL的数据库,而不是迁移。。。因此,迁移将认为它仍然存在,并尝试将其删除,但失败。如果在运行迁移时指定VERSION=0,则它将从一开始就运行它们。