【发布时间】:2012-09-05 14:30:55
【问题描述】:
在找到2个与字符串与文本字段相关的SO问题后,我发现链接字段已经是文本:
create_table "answers", :force => true do |t|
t.string "text"
t.text "link"
为什么 Postgres 会抛出以下错误:
ActiveRecord::StatementInvalid: PG::Error: ERROR: value too long for type character varying(255)
我尝试了迁移 change_column :answers, :link, :text, :limit => nil,但我认为这没有任何作用。
编辑:所以,问题在于架构说该字段是文本,但实际上它是字符串:
Answer.new.column_for_attribute('link').type
=> :string
修复它的最佳方法是什么?通过从模式重建数据库?通过将其更改为字符串然后返回文本?
Rails 3.2.2、Postgres 9、Heroku。
【问题讨论】:
-
只是我的 0.02 美元,但我避免使用有点神秘的
create_table和朋友来编写我的 Rails 迁移。我只是为 PostgreSQL/MySQL 执行适当的语句。我想确切地知道我的架构是什么样的(类型、索引、约束等)。 -
由于
text列没有限制,而character和character varying在 PostgreSQL 中默认分别有 1 和无限制,因此创建表的代码必须明确指定限制255. 因此,PostgreSQL 正在按预期工作。 -
确定不是名为“text”的列有问题吗?我会通过其他方式(psql)连接到数据库,以验证事情是否如您所想。根据我的经验,迁移往往表现良好。也许迁移在您运行之后发生了变化?
-
是的,我确信“文本”。这也是一个很好的可能性。
-
最好的办法是在使用 PostgreSQL 时忘记
t.string的存在,而在任何地方都使用t.text。varchar在 PostgreSQL 中是不合时宜的,所以除非你需要特定大小的字符串,否则不要打扰它。
标签: ruby-on-rails ruby-on-rails-3 postgresql heroku