【问题标题】:Rails migration file fails - Mysql2::Error: Data truncated for columnRails 迁移文件失败 - Mysql2::Error: Data truncated for column
【发布时间】:2015-07-20 08:45:42
【问题描述】:

我已经设置了一个新的迁移文件:

class ChangeCourseDefaults < ActiveRecord::Migration
  def self.up
    change_column_null :course_objects, :active, false
    change_column_default :course_objects, :active, 0
  end
end

我在我的 debian 服务器上以这种方式运行它(rails 4.2.1 ruby​​ 2.1)

sudo bundle exec rake db:migrate:up VERSION=20150720095700 RAILS_ENV=test

然后我得到了这个错误:

Mysql2::Error: Data truncated for column 'active' at row 1: ALTER TABLE `course_objects` CHANGE `active` `active` tinyint(1) NOT NULL/var/www/html/test/xyz/vendor/bundle/ruby/2.1.0/gems/activerecord-4..2.1/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:299:in `query'

有什么问题?

【问题讨论】:

  • 之前是否有任何记录已经为空。?请检查
  • 是的,有很多
  • 是的,这就是为什么当这条线change_column_null :course_objects, :active, false 运行时它会检查所有值并确认不应该有任何空值。在这里它崩溃了。但我想下面粘贴的答案会解决你的问题。

标签: ruby-on-rails ruby rake


【解决方案1】:

您可以使用change_column_null

class ChangeCourseDefaults < ActiveRecord::Migration
  def change
    change_column_null :table_name, :column_name, false, 0 # set default as 0
  end
end

【讨论】:

  • 我收到了这个错误:未定义的方法null' for #&lt;ChangeCourseDefaultsNull:0x00000005be8de0&gt;/var/www/html/test/xyz/vendor/bundle/ruby/2.1.0/gems/activerecord-4.2.1/lib/active_record/migration.rb:661:in block in method_missing'
  • 将 null 替换为 false。
  • docs for change_column_null 说:“该方法接受可选的第四个参数,以用其他值替换现有的 +NULL+s。如果需要,请在启用约束时使用该参数,否则这些行将无效。请注意第四个参数不设置列的默认值。"
【解决方案2】:
class ChangeCourseDefaults < ActiveRecord::Migration
  def change
    change_column_null :course_objects, :active, false, 0
  end
end

参考:change_column_null for existing column

【讨论】:

  • 我刚刚添加了答案,因为上面几乎没有问题。一旦正确,请接受上面的答案菲利克斯。他有更多的权利。:)
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2018-09-22
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
相关资源
最近更新 更多