【问题标题】:Why is there an error for a character limit of 255 on text field in PostgreSQL?为什么 PostgreSQL 中文本字段的字符限制为 255 会出错?
【发布时间】: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 列没有限制,而 charactercharacter varying 在 PostgreSQL 中默认分别有 1 和无限制,因此创建表的代码必须明确指定限制255. 因此,PostgreSQL 正在按预期工作。
  • 确定不是名为“text”的列有问题吗?我会通过其他方式(psql)连接到数据库,以验证事情是否如您所想。根据我的经验,迁移往往表现良好。也许迁移在您运行之后发生了变化?
  • 是的,我确信“文本”。这也是一个很好的可能性。
  • 最好的办法是在使用 PostgreSQL 时忘记t.string 的存在,而在任何地方都使用t.textvarchar 在 PostgreSQL 中是不合时宜的,所以除非你需要特定大小的字符串,否则不要打扰它。

标签: ruby-on-rails ruby-on-rails-3 postgresql heroku


【解决方案1】:

不太清楚它是如何发生的,但有以下情况之一:

  1. 我在运行迁移后检查了架构,实际上它是同步的。
  2. 我进行了迁移以将类型更改为字符串,从而使架构同步。

【讨论】:

    【解决方案2】:

    使用发送到 Postgres 的原始 SQL 语句编写您的迁移。只需使用您在 psql 控制台中直接运行的任何内容调用execute。这是准确了解数据库将处于何种状态的最佳方式。通常,这比让 Rails 为您定义架构更好。您确实应该定期查看您的架构,尤其是在运行迁移之后。

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 2014-11-29
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多