Rails 迁移错误

Posted

技术标签:

【中文标题】Rails 迁移错误【英文标题】:Rails migration error 【发布时间】:2011-08-21 22:31:14 【问题描述】:

这看起来很简单,但我不确定出了什么问题。

我正在尝试在我的 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

我唯一能想到的是,这个 change_column 是在我将列添加到 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 ''

【问题讨论】:

【参考方案1】:

试试

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

【讨论】:

【参考方案2】:

如果有人看到这篇文章并发现这很有用。我遇到了同样的问题,另一种避免它的方法是更改​​ mysql 配置,以便 sql-mode 不严格,即不包括默认情况下的STRICT_TRANS_TABLES

【讨论】:

更详细的在这里***.com/questions/3466872/… 每个数据库有什么办法吗?【参考方案3】:

您是否有其他使用:text 指定:limit 的迁移有效?

如果我没看错的话,: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

【讨论】:

是的,在我提到我的实验的帖子中,我错过的是实验是将旧行更改为我尝试在此新迁移中使用的行,它确实有效。然而,它们似乎不能连续工作。【参考方案4】:

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

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

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

曾经

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

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

【讨论】:

【参考方案5】:

试试这个:

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

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

【讨论】:

【参考方案6】:

这对我有用:

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

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

【讨论】:

以上是关于Rails 迁移错误的主要内容,如果未能解决你的问题,请参考以下文章

添加带有rails迁移错误的整数数组列

Heroku / Rails:PG :: Undefined Table:错误“[tablename]”在heroku rails迁移上不存在

Rails 和 Postgres:迁移到 change_colomn 时出现错误“无法强制转换为没有时区的时间戳”

迁移 DB Rails 时出错

Rails Money迁移失败

在 Elastic Beanstalk 环境上部署 ruby​​ on rails 应用程序时出现 AWS 数据库迁移错误