Ruby on rails 我的rails迁移赢得了';我跑不了,我也跑不了;不要部署我的rails应用程序。我怎样才能重新开始?
在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 ===============================================
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
如果模式不兼容,那么您可能可以遵循此过程,但您必须编辑在第一步中创建的文件中的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,则它将从一开始就运行它们。