gpt4 book ai didi

ruby-on-rails - Heroku 数据库 :push error (rails)

转载 作者:行者123 更新时间:2023-11-29 13:06:49 25 4
gpt4 key购买 nike

当我运行 $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 个字符的字符串属性。

我想我在“类(class)”模型的“描述”属性中发现了问题。

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

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

谢谢!

编辑:

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

  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

最佳答案

您的第一步是在同一个堆栈上进行开发和部署;在 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 is 中,这应该为您提供类型为 TEXT 的列“可变无限长度”字符类型。

为此使用 :text 是获得任意大文本列的最佳方式。

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

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

关于ruby-on-rails - Heroku 数据库 :push error (rails),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com