mysql - 列数据太长 - Rails 4 迁移已取消

标签 mysql ruby ruby-on-rails-4

我最初做了如下迁移

class Createfriends < ActiveRecord::Migration
  def change
    create_table :friends do |t|
      t.string :FirstName
      t.string :LastName
      t.string :MiddleName
      t.string :Gendre
      t.string :Email
      t.string :ImageUrl
      t.string :Country
      t.string :City
      t.timestamps null: false
    end
  end
end

然后我需要更改 ImageUrl 的类型,因为有人可以加载发送可能超过 255 个字符的链接路径,所以我进行了另一个迁移,如下所示

class ChangeImageUrlInWaiter < ActiveRecord::Migration
  def up
    change_column :friends, :ImageUrl , :text
  end

  def down
    change_column :friends ,:ImageUrl , :string
  end
end

现在,当我尝试使用

回滚所有迁移时
rake db:migrate VERSION=0

它会抛出错误

rake aborted! StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Data too long for column 'ImageUrl' at row 1: ALTER TABLE waiters CHANGE ImageUrl ImageUrl varchar(255) DEFAULT NULL

原因很明显,ImageUrl 中存在超过 255 的数据,现在的问题是如何解决保存数据或即使不得不丢失一些数据的问题

最佳答案

如果您可以截断数据,则只需在将模式更改回 255 字符之前发出 UPDATE 查询。

不要使用 ActiveRecord in migrations ,很难做到正确,并且可能会给您带来不同类型的问题。所以,你需要这个:

  def down
    execute 'UPDATE friends SET ImageUrl = SUBSTR(ImageUrl, 1, 255)'
    change_column :friends, :ImageUrl, :string
  end

关于mysql - 列数据太长 - Rails 4 迁移已取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32501808/

相关文章:

javascript - 在本地运行SLS函数以进行单元测试,结果是 Node Mysql连接池“连接过多”

mysql - 将查询中的单个值复制到 MySQL 触发器中的新列/变量中

ruby-on-rails - rails 4 : how to use OR between conditions on find methods

ruby-on-rails-4 - HABTM关联: Unpermitted parameters

html - 根据 rails 4 中的页面显示不同的样式表

php - 突然无法读取数据库?

php - 使用sql检查特定时间的餐厅表可用性

ruby - 定义一个继承自 Rack::Builder 的类

ruby-on-rails - rails : Relations (Select all answers from all topics)

ruby-on-rails - 如何知道要拯救哪些异常?