Rails迁移错误

时间:2011-05-09 19:23:26

标签: ruby-on-rails rails-migrations

这看起来非常简单,但我不确定会出现什么问题。

我正在尝试在我的Rails迁移中执行以下操作:

change_column :foo, :bar, :text, :limit => 16777215

我收到以下错误

Mysql::Error: BLOB/TEXT column 'bar' can't have a default value: ALTER TABLE `foo` CHANGE `bar` `email_contents` text(16777215) DEFAULT '' NOT NULL

我唯一可以解决的问题是,在我将列添加到foo之后不久就发生了这个change_column,并且必须首先将它从type:string更改为type:text。这些都来自他们自己的迁移脚本,如下所示:

add_column :foo, :bar, :string, :null => false

change_column :foo, :bar, :text

作为一项实验,我尝试更改第一个change_column(change_column:foo,:bar,:text)并发现这成功地改变了表格。遗憾的是,我无法更改以前的任何迁移,只能在当前的实现中添加新的迁移,因此无法在生产中使用。问题是,什么允许我更改一次但不是两次?

更新尝试了第一个建议,但得到了以下内容:

Mysql::Error: BLOB/TEXT column 'bar' can't have a default value: ALTER TABLE `foo` CHANGE `bar` `bar` text(16777215) DEFAULT ''

6 个答案:

答案 0 :(得分:12)

尝试

change_column :foo, :bar, :text, :limit => 16777215, :default => nil, :null => true

答案 1 :(得分:3)

如果有人遇到此帖并发现此内容有用。我有同样的问题,另一种方法是避免更改mysql配置,以便sql-mode不严格,即默认不包括STRICT_TRANS_TABLES

答案 2 :(得分:1)

您是否有其他迁移,:limit指定:text有效?

可能:text不接受:limit,如果我正确读取它,它只是映射到特定的MySQL数据类型。

Rails迁移类型和MySQL数据类型的映射: http://www.orthogonalthought.com/blog/index.php/2007/06/mysql-and-ruby-on-rails-datatypes/

MySQL TEXT类型(没有提到LIMIT,但我认为不排除它: http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

答案 3 :(得分:1)

对我来说,这似乎是从MySQL 5.5.x转到5.6.x

的结果

注意:有人应该阅读Semantic Versioning 2.0.0

我的修复很简单......

WAS

change_column :my_table, :my_column, :mediumtext #=> Migrations Explosion

IS

change_column :my_table, :my_column, :mediumtext, default: nil #=> All good in the mysql 5.6.21 

答案 4 :(得分:0)

试试这个:

change_column :foo, :bar, :text, :limit => 16777215, :null => true

当使用:null => false时(如在旧的迁移中),Rails将DEFAULT位添加到ALTER TABLE语句中。但是,就像错误所说的那样,TEXT列不能有DEFAULT。通过在新迁移中将其更改为:null => true,问题应该消失。

答案 5 :(得分:0)

这对我有用:

    change_column :delayed_jobs, :handler, :text, 
      limit: 16777215, null: true, default: nil

我必须添加default: nil,然后Rails就可以设置null: true,这会删除早期迁移中定义的默认值。