読者です 読者をやめる 読者になる 読者になる

Milk+ea

Weblog Is My Hobby.

Sequelのマイグレーション機能を使う

Ruby

マイグレーションを使うと新規テーブルを作ったり、作らなかったことにできます。

今いるディレクトリにRakefileとdbファイル、dbフォルダを置いてdb\migrateフォルダの中にmigrationファイルを入れるような感じで。

├─Rakefile
├─**.db (sqlite)
├─db
│  ├─migrate

Migratefile

[table名]は変えてこんな感じに書く。

Sequel.migration do
  change do
    create_table(:[table名] do
      # いろいろcolの設定
      # primary_key :id
      # datetime :created_at, default: Time.now
    end
  end
end

ファイルは001_create_[table名]みたいな何してるのか分かる名前に。
マイグレーションは1番目から順番に実行されていくから必ず1から始める。
002,003,004...という感じで次に作ったファイルには名前を付けていく。


Rakefile

Rakefileマイグレーションを実行できるように。
[**.db]の部分は変えて、こんな感じのRakefileという名前のファイルを今のディレクトリに作る。

# coding: utf-8

namespace :db do
  require "sequel"
  Sequel.extension :migration
  DB = Sequel.connect('sqlite://[**.db]')
  
  # ここにいろいろ書いていく。
end

まずマイグレーションを実行する所を。

desc 'migrationファイルを実行'
task :migrate do
  Sequel::Migrator.apply(DB, 'db/migrate')
  # または Sequel::Migrator.run(DB, 'db/migrate')
end

これでrake db:migrateとすると、migrate内のすべてのmigrationファイルが実行される。
もし実行したいファイルを指定したい時は:target:currentを使う。

Sequel::Migrator.run(DB, 'db/migrate', target: 2) # 002まで実行
Sequel::Migrator.run(DB, 'db/migrate', target: 4, current: 2) # 003と004だけ実行

そしたらしばらく戻し方がわからなくなった。


すべてのマイグレーションを無かったことに(ロールバックする)したいのなら:targetに0を渡す。

desc 'ロールバック'
task :rollback do
  Sequel::Migrator.run(DB, 'db/migrate', target: 0)
end

005ぐらいまで実行していて002ぐらいに戻したい時は`:target'を2にしたりするだけでマル。

自分がどこまで実行しているかは、マイグレーションを実行したときにdbファイルにschema_infoというテーブルができているのでselect * from schema_info;な感じで確認できる。


ちなみに「全ファイル実行済か」みたいなのは.is_current?.check_currentで確認できるとか。
前者はtrue,falseが帰ってきて、後者はエラーmigrator is not currentが帰ってくるみたい。
よくわからん(˘ω˘)