Несколько соединений с базой данных: schema_migrations ищется в неправильной базе данных - PullRequest
8 голосов
/ 09 июля 2011

Я пытаюсь использовать вторичное соединение с базой данных для некоторых моих миграций следующим образом:

# 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

В моем файле database.yml настроено соединение staging_db.

Когда язапустите rake db: migrate, таблица foo правильно создана в схеме staging_db, а таблица schema_migrations создана в соединении разработки RAILS_ENV =.Однако db: migrate сообщает о следующей ошибке (которая завершается ошибкой при последующих миграциях):

Таблица 'staging_db.schema_migrations' не существует

Есть ли способ сообщить о подготовке:: Миграция для поиска таблицы schema_migrations в текущем соединении RAILS_ENV?

Кстати, мне известно о том, что staging_db тогда не поддерживает RAILS_ENV.Это хорошо для меня, так как каждый сервер имеет свою среду, настроенную через отдельный database.yml, которого нет в моем репо.

Ответы [ 2 ]

4 голосов
/ 25 мая 2012

Вы должны попытаться сделать это перед первой миграцией в staging_db:

ActiveRecord::Base.connection.initialize_schema_migrations_table

Это создаст таблицу миграции схемы в промежуточной базе данных.Если это не то, что вы хотите, вам придется манипулировать другими вещами.Имени schema_migrations_table_name определяют, какая таблица содержит версии миграции:

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

Таким образом, если у вас определено определение table_name_prefix, это приведет к тому, что schema_migration_table будет выглядеть в промежуточной базе данных.

0 голосов
/ 10 июля 2011

Я уже сделал это, но за пределами рельсов, в рельсах это не должно сильно отличаться, вот как я это делаю:

Первое, что нужно сделать, это подключить вашу базу данных перед выполнением миграций в рельсах.лучшее место может быть в инициализаторе:

MyModel.establish_connection({
  :adapter => "mysql2",
  :database => "mydb",
  :username => "root",
  :encoding => 'utf8'
})

Хеш будет обычно загружаться из файла yml, но это результат, который вы хотите получить в конце.
MyModel может быть абстрактным классом, если выУ вас есть несколько моделей в этой базе данных.

Далее, когда вы хотите перенести эту базу данных, вам просто нужно сделать следующее:

class DoDomething < ActiveRecord::Migration
  def self.connection
    MyModel.connection
  end

  def self.up
    add_column [...]
  end
end

Одна вещь, которую следует учитывать при выполнении таких действий, эточто будет только одна таблица schema_migrations, и она будет в «основной» базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...