Rails 迁移错误

6

这看起来很直接,但我不确定哪里出了问题。

我正在尝试在我的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后不久,我需要将其从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个回答

12

尝试

更改列:foo,bar,text,限制=>16777215,默认值=>nil,null=>true


3

如果有人看到这篇文章并发现它有用的话,我也遇到了同样的问题。另外一种避免这个问题的方法是更改mysql配置,使得sql-mode不是严格模式,即不包括STRICT_TRANS_TABLES,该项在默认情况下会被包含。


更详细的内容请参考:https://dev59.com/8nA75IYBdhLWcg3wH1JB - sab
有没有办法按数据库来做到这一点? - Kurt Mueller

1

是的,在我提到我的实验的帖子中,我错过了一个细节,那就是这个实验是为了将旧代码行更改为我正在尝试在这个新迁移中使用的代码行,并且它确实有效。然而,它们似乎不能连续工作。 - keybored

1

对我来说,这似乎是从MySQL 5.5.x升级到5.6.x的结果。

注意:应该有人去阅读语义化版本2.0.0

我的解决方法很简单...

原来

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 

0
这对我有用:
    change_column :delayed_jobs, :handler, :text, 
      limit: 16777215, null: true, default: nil

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


0

试试这个:

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

当使用:null => false(如旧迁移中)时,Rails会将DEFAULT位添加到ALTER TABLE语句中。但是,就像错误提示的那样,TEXT列不能具有默认值。通过在新迁移中将其更改为:null => true,问题应该就可以解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接