2012-09-05 66 views
3

所以找到2相關的字符串與文本字段問題之後,我發現鏈接字段已經文本:爲什麼PostgreSQL中文本字段的字符數限制爲255?

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。

+1

只是我的0.02美元,但我避免使用有點神祕的'create_table'和朋友編寫我的Rails遷移。我只是爲PostgreSQL/MySQL執行適當的語句。我想知道我的模式是什麼樣子(類型,索引,約束等)。 – d11wtq

+1

由於'文本'列沒有限制,'字符'和'字符變化'在PostgreSQL中默認限制爲1,沒有任何限制,所以創建表的代碼必須明確指定限制爲255.因此,PostgreSQL是按預期工作。 – aib

+1

確定它不是名爲「text」的列是一個問題?我會通過其他方式(psql)連接到數據庫以驗證事情是否如您所想。根據我的經驗,遷移往往表現得很好。運行後遷移可能會發生變化? – eevar

回答

1

不太清楚怎麼回事,但下列之一:

  1. 我檢查的模式運行遷移後,所以實際上它是同步的。
  2. 我運行遷移將類型更改爲字符串,使模式同步。
0

使用發送給Postgres的原始SQL語句編寫遷移。只需撥打execute即可直接在psql控制檯中運行。這是確切瞭解你的數據庫將保留在什麼狀態的最好方法。通常這是一個比讓Rails爲你定義模式更好的解決方案。您應該經常查看您的架構,尤其是在運行遷移之後。

相關問題