1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

複数データベースのmigrationを管理するgem 「banana」を使ってみた

Last updated at Posted at 2015-02-08

bananaとは

データベースが複数ある時のmigrationをうまい事やってくれるgemです。
このテーブルはこのDB、こっちのテーブルは別のDBに作るといった事を簡単にできます。
Githubページはこちらです。

導入

Gemfile
gem 'banana'
bundle install

使い方

下のように「DATABASE_NAME」を定義するだけです。
この状態でmigrateすれば指定したデータベースにテーブルを作ってくれます。

db/migrate/20150208121021_create_users.rb
class CreateUser < ActiveRecord::Migration
  DATABASE_NAME = "db2"

  def change
    create_table :onions do |t|
      t.timestamps
    end
  end
end
config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  reconnect: false
  pool: 5
  username: root
  password:
  socket: /var/run/mysqld.sock

db1:
  <<: *default
  database: db1

db2:
  <<: *default
  database: db2

複数DBへの接続方法

これは「banana」の機能ではなくRailsがデフォルトで持ってる機能です。
このmodelはdb2に接続したいといった場合は下のように記述します。

app/models/user.rb
class User < ActiveRecord::Base
  establish_connection :db2
end

少しハマった所

table already existsになるパターンがある

bananaを利用していると「table already exists」エラーに遭遇する事があります。
発生するパターンは下の通りです。

  1. migrationでdb1とdb2にテーブルを作成
  2. db1だけ削除して再度migrate
  3. db2に対してテーブルを作ろうとして「table already exists」エラー

bananaはschema_migrationsのレコードをメインDBにしか作らないので、db2にテーブルがある場合にもcreate tableしようとしてエラーになります。
データベースをリセットしたい時は気をつけた方が良さそうです。

その他

Rails4にしたせいか他Gemの環境かは確認してないのですが、一部のコマンドでエラーが出ました。
確認した限りだと「rake db:create」「rake db:reset」でエラーが出てます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?