我试图通过以下方式为我的一些迁移使用辅助数据库连接:
# 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' 不存在
有没有办法让Staging :: Migration在当前的RAILS_ENV连接中查找schema_migrations表?
顺便说一下,我知道staging_db不是RAILS_ENV感知的事实。这对我来说很好,因为每个服务器都通过一个单独的database.yml来配置它的环境,而这个数据库不在我的仓库中。答案 0 :(得分:4)
您应该在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查看登台数据库。
答案 1 :(得分:0)
我已经做了这个但是在轨道之外,在轨道上应该没有什么不同,这就是我的方法:
首先是在执行迁移之前连接数据库,在rails中最好的位置可能在初始化程序中:
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表,它将位于“主”数据库中。