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 迁移错误的主要内容,如果未能解决你的问题,请参考以下文章
Heroku / Rails:PG :: Undefined Table:错误“[tablename]”在heroku rails迁移上不存在
Rails 和 Postgres:迁移到 change_colomn 时出现错误“无法强制转换为没有时区的时间戳”
在 Elastic Beanstalk 环境上部署 ruby on rails 应用程序时出现 AWS 数据库迁移错误