2015年6月1日月曜日

postgresqlでadd_columnのafterが効かない

herokuにrailsアプリを載せるために開発していたのですが、
カラムを追加したいとなり、どうせならきれいな位置に配置したいなと思い、
afterを使ってカラムの位置を指定してみたところ、
指定した位置に追加されなかったので調べたときの件です。

こういうテーブルをもともと用意していました。
class CreateItems < ActiveRecord::Migration
  def change
    create_table :items do |t|
      t.string :name
      t.string :img
      t.integer :price
 
      t.timestamps null: false
    end
  end
end

カラムを追加するために以下のコードを追加しました。
class AddColumnToItem < ActiveRecord::Migration
  def change
    add_column :items, :stock, :integer, after: :price
  end
end

追加後にpostgresqlのテーブル定義を確認したところ、
stockがpriceの後ろではなく、テーブルの一番最後のカラムに追加されてしまいました。
$ psql test
psql (9.4.1)
Type "help" for help.
 
test=# \d items
                                     Table "public.items"
   Column   |            Type             |                     Modifiers                      
------------+-----------------------------+----------------------------------------------------
 id         | integer                     | not null default nextval('items_id_seq'::regclass)
 name       | character varying           | 
 img        | character varying           | 
 price      | integer                     | 
 created_at | timestamp without time zone | not null
 updated_at | timestamp without time zone | not null
 stock      | integer                     | 
Indexes:
    "items_pkey" PRIMARY KEY, btree (id)


調べてみたところ、
postgresqlではそもそも列の位置を変えることができないようです。
列の位置を変えたい場合はテーブル作り直すか、
最終的なレイアウトになるまでデータを移す作業をしていくしかないようです。
これに関してはMySQLの方が柔軟でよいですね。
結局、まだ開発中のものだったので、初めからstockをpriceの後に入れたものでテーブルを作り直しました。


http://qiita.com/masamitsu-konya/items/c4f75fc02347de9f8b0f
http://stackoverflow.com/questions/27214251/postgresql-add-column-after-option-usage-in-rails-migration
http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_column#637-Options
http://dba.stackexchange.com/questions/3276/how-can-i-specify-the-position-for-a-new-column-in-postgresql
https://wiki.postgresql.org/wiki/Alter_column_position/ja

0 件のコメント:

コメントを投稿