Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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
Mysql 当部分迁移失败时,为什么';“不是吗?”;撤销;?_Mysql_Ruby On Rails_Activerecord_Migration - Fatal编程技术网

Mysql 当部分迁移失败时,为什么';“不是吗?”;撤销;?

Mysql 当部分迁移失败时,为什么';“不是吗?”;撤销;?,mysql,ruby-on-rails,activerecord,migration,Mysql,Ruby On Rails,Activerecord,Migration,假设我有这个迁移: class MigrateStuff < ActiveRecord::Migration def up add_column :contacts, :receive_newsletter, :boolean, :default => false add_index :contacts, :receive_newsletter for t in SomeOtherThing.all #... do stuff in here

假设我有这个迁移:

class MigrateStuff < ActiveRecord::Migration
  def up
    add_column :contacts, :receive_newsletter, :boolean, :default => false
    add_index :contacts, :receive_newsletter

    for t in SomeOtherThing.all
      #... do stuff in here
    end
  end

  def down
    #...
  end
end
因此,在
for
块中发生异常,这不会导致事务回滚吗?但是列和索引仍然存在


处理此问题的正确方法是什么?

另一种方法是通过引发ActiveRecord::rollback exception手动回滚

raise ActiveRecord::Rollback

当您想要回滚时。

MySQL不支持对架构进行事务性更改。解决这个问题最简单的方法就是切换到Postgres。它们在很大程度上是兼容的,特别是当你使用Arel来构建你的查询时。很高兴知道。那么,为什么rake/rails不能聪明地撤销模式更改呢?我想它可能会变得混乱。事务块中引发的“正常”异常会导致事务回滚吗?没有其他异常不会回滚它back@techvineet,没有其他例外情况不会回滚:这是错误的。任何异常都将导致回滚。不同之处在于,如果引发
ActiveRecord::Rollback
,则不会重新引发异常(因此无法处理该异常);所有其他异常都将导致回滚,并将冒泡到您的应用程序中。@TechVinet,谢谢,我知道如何使用SO.:)你的回答没有回答我的问题。我知道如何在事务中回滚,但不知道如何回滚模式更改——coreyward解释说,这在MySQL中是不可能的。不过,谢谢你的回答。
raise ActiveRecord::Rollback