:note

migrationファイルで特定の位置にカラムを追加する

migrationのafterとbeforeオプションで、特定の位置にカラムを追加しようとしたら、 sqlite3だとオプションが有効にならないみたいだったので調べた。

scaffoldした初期状態

class CreateDogs < ActiveRecord::Migration[5.0]
  def change
    create_table :dogs do |t|
      t.string :name
      t.integer :age

      t.timestamps
    end
  end
end

migrationファイルを生成して、 ageのあとにcolorカラムを追加したいので、afterオプションを追加

% bin/rails g migration add_color_to_dogs
class AddColorToDogs < ActiveRecord::Migration[5.0]
  def change
    add_column :dogs, :color, :string, after: :age
  end
end

mysql

# db/schema.rb
ActiveRecord::Schema.define(version: 20170120021430) do

  create_table "dogs", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.string   "name"
    t.integer  "age"
    t.string   "color"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

colorはageの後に挿入されている

mysql> show create table dogs;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                       |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dogs  | CREATE TABLE `dogs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `color` varchar(255) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

sqlite

# db/schema.rb
ActiveRecord::Schema.define(version: 20170120015424) do

  create_table "dogs", force: :cascade do |t|
    t.string   "name"
    t.integer  "age"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string   "color"
  end

end

colorは末尾に追加されている

sqlite> .schema
CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY);
CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
CREATE TABLE "dogs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "age" integer, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL, "color" varchar);

sqliteはカラム順の変更できないをしらなかった。再生成するしかないのか

sqlite - Sqlite3: how to reorder columns in a table? - Stack Overflow

 
comments powered by Disqus
back to top