Rails迁移将列类型从文本更改为json(Postgresql)

时间:2016-10-30 02:01:56

标签: ruby-on-rails postgresql rails-migrations

我一直在努力将Postgres数据库中的列类型从text更改为json。这是我尝试过的......

class ChangeNotesTypeInPlaces < ActiveRecord::Migration[5.0]
  def up
    execute 'ALTER TABLE places ALTER COLUMN notes TYPE json USING (notes::json)'
  end

  def down
    execute 'ALTER TABLE places ALTER COLUMN notes TYPE text USING (notes::text)'
  end
end

也...

class ChangeNotesTypeInPlaces < ActiveRecord::Migration[5.0]
  def up
    change_column :places, :notes, 'json USING CAST(notes AS json)'
  end

  def down
    change_column :places, :notes, 'text USING CAST(notes AS text)'
  end
end

这两个都返回相同的错误......

PG::InvalidTextRepresentation: ERROR:  invalid input syntax for type json

3 个答案:

答案 0 :(得分:6)

使用Rails 5.1.x和PostgreSQL 9.4,在将文本列(包含有效的json)转换为jsonb列时,这对我有用:

class ChangeTextColumnsToJson < ActiveRecord::Migration[5.1]
  def change
    change_column :table_name, :column_name, :jsonb, using: 'column_name::text::jsonb'
  end
end

答案 1 :(得分:1)

我能够使用以下方式完成它:

def change
  change_column :places, :notes, :json, using: 'notes::JSON'
end

但这不可逆转;我想你可以将它分成单独的上下定义,但我觉得不需要。

答案 2 :(得分:0)

我刚解决了类似的问题。试图根据你的问题调整它,它看起来(主要是?)就像这样。

class ChangeNotesTypeInPlaces < ActiveRecord::Migration[5.0]
  def up
    change_column :places, :notes, :jsonb, using: 'CAST(value AS JSON)'
  end

  def down
    change_column :places, :notes, :text
  end
end