Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple database connections: schema_migrations is looked up in the wrong database

I am trying to use a secondary database connection for some of my migrations in the following way:

# app/models/staging/migration.rb
class Staging::Migration < ActiveRecord::Migration
    def self.connection
        ActiveRecord::Base.establish_connection(:staging_db).connection
    end
end

# db/migrate/<timestamp>_create_foo.rb
class CreateFoo < Staging::Migration
    ....
end

In my database.yml the staging_db connection is configured.

When I run rake db:migrate, the table foo is created correctly in the staging_db schema, and the table schema_migrations is created in the RAILS_ENV=development connection. However db:migrate reports the following error (which fails subsequent migrations):

Table 'staging_db.schema_migrations' doesn't exist

Is there a way to tell Staging::Migration to look for the schema_migrations table in the current RAILS_ENV connection?

BTW, I am aware of the fact that staging_db is then not RAILS_ENV-aware. This is fine for me since every server has its environment configured through a separate database.yml which is not in my repo.

like image 509
AmitA Avatar asked Jul 08 '11 22:07

AmitA


1 Answers

You should try do this before your first migration in the staging_db:

ActiveRecord::Base.connection.initialize_schema_migrations_table

This will create a schema migration table in the staging db. If this is not what you want you will have to manipulate some other things. The schema_migrations_table_name determines which table contains the migration versions:

def schema_migrations_table_name
  Base.table_name_prefix + 'schema_migrations' + Base.table_name_suffix
end

So if you have a table_name_prefix defined it will cause the schema_migration_table to look in the staging db.

like image 73
HannesBenson Avatar answered Nov 14 '22 03:11

HannesBenson