Heroku db:推送错误(rails)

时间:2011-10-23 20:14:51

标签: ruby-on-rails postgresql heroku migration

当我运行$ heroku db:push时,我收到以下错误:

Saving session to push_201110231302.dat..
!!! Caught Server Exception
HTTP CODE: 500
Taps Server Error: PGError: ERROR:  value too long for type character varying(255)

讨论here表明这是因为我的一个模型的字符串属性长于255个字符。

我想我在“课程”模型的“descrip”属性中发现了问题。

我尝试通过将描述符的类型从字符串更改为文本来解决此问题。我通过生成并运行“remove_descrip_from_Course descrip:string”类型迁移,然后生成/运行“add_descrip_to_Course descrip:text”来完成此操作。但这没有用 - 描述仍然显示为一个字符串。

有没有人知道(1)将字符串中的描述更改为文本是解决heroku问题的​​最佳(唯一?)方法,以及(2)我可以做些什么来将描述从字符串更改为文本?

谢谢!

已编辑:

这是我的schema.rb文件的相关部分(descriptionp在底部):

  create_table "courses", :force => true do |t|
    t.string   "name"
    t.string   "number"
    t.string   "instructor"
    t.string   "room"
    t.string   "day"
    t.string   "units"
    t.string   "time"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "limitations"
    t.string   "address"
    t.string   "end_time"
    t.string   "start_time"
    t.string   "crn"
    t.string   "term_code"
    t.text     "evals"
    t.boolean  "paper_required"
    t.string   "exam_type"
    t.string   "paper_type"
    t.string   "past_instructors"
    t.string   "past_semesters"
    t.string   "tod"
    t.boolean  "in_cart",          :default => false
    t.integer  "day_num"
    t.integer  "time_num"
    t.string   "units_alt"
    t.text     "descrip"
  end

这是add_descrip_to_course迁移:

class AddDescripToCourse < ActiveRecord::Migration
  def self.up
    add_column :courses, :descrip, :text
  end

  def self.down
    remove_column :courses, :descrip
  end
end

但这是我的rails控制台中发生的事情:

ruby-1.9.2-p290 :008 > a = Course.new
 => #<Course id: nil, name: nil, number: nil, instructor: nil, room: nil, day: nil, units: nil, time: nil, created_at: nil, updated_at: nil, limitations: nil, address: nil, end_time: nil, start_time: nil, crn: nil, term_code: nil, evals: nil, paper_required: nil, exam_type: nil, paper_type: nil, past_instructors: nil, past_semesters: nil, tod: nil, in_cart: false, day_num: nil, time_num: nil, units_alt: nil, descrip: nil> 
ruby-1.9.2-p290 :009 > a.descrip = "test"
 => "test" 
ruby-1.9.2-p290 :010 > a.descrip.class
 => String 

2 个答案:

答案 0 :(得分:2)

您的第一步是在同一堆栈上开发和部署;在MySQL或SQLite之上开发然后在PostgreSQL之上部署只是在寻找麻烦,PostgreSQL(谢天谢地)比SQLite和MySQL严格得多。因此,如果您要部署到Heroku,请在本地安装PostgreSQL。

要更改列类型,您应该可以在迁移中使用它:

def self.up # or "def change" or "def up" depending on your Rails version
    change_column :courses, :descrip, :text
end

这应该会给你一个PostgreSQL中TEXT类型的列和TEXT is一个“变量无限长度”字符类型。

使用:text这是获得任意大型文本列的最佳方法。

如果您真的不想要无限长度,那么您应该在模型中包含长度验证。 MySQL会默默地截断你的数据,而SQLite会忽略字符串列的长度,PostgreSQL也不会做这些事情。

在Rails / ActiveRecord世界中,所有字符串类型都是String的实例,因此char(n)varchar(n)text都以字符串形式出现,并以字符串形式输入。

答案 1 :(得分:0)

我曾经遇到过类似的问题(我不得不将字符串更改为文本),并遇到了相同的障碍。我最终不得不进行迁移,删除整个表并使用适当的列类型重新创建。