我发现this question非常有趣,我想了解如何生成迁移以在我的项目中使用的其他数据库中创建表。
如何进行这样的迁移,在第二个数据库中生成表?
class CreateOriginalCompanies < ActiveRecord::Migration
def change
create_table :original_companies do |t|
t.string :CompanyName
t.string :RegAddress_AddressLine1
t.string :RegAddress_AddressLine2
t.string :RegAddress_PostTown
t.string :RegAddress_Country
t.string :RegAddress_PostCode
t.string :CompanyCategory
t.string :CompanyStatus
t.timestamps null: false
end
end
end
有任何线索吗?
答案 0 :(得分:9)
佣金任务
让我们直接进入。显然我们想要处理两个数据库的迁移,所以我们需要两个单独的Rake任务来处理它:
desc "Migrate the database through scripts in db/migrate."
namespace :db do
task :migrate do
Rake::Task["db:migrate_db1"].invoke
Rake::Task["db:migrate_db2"].invoke
end
task :migrate_db1 do
ActiveRecord::Base.establish_connection DB1_CONF
ActiveRecord::Migrator.migrate("db/migrate/db1/")
end
task :migrate_db2 do
ActiveRecord::Base.establish_connection DB2_CONF
ActiveRecord::Migrator.migrate("db/migrate/db2/")
end
end
我们的首要任务是db:migrate
,代表db:migrate_db1
和db:migrate_db2
。
每个人都建立与数据库的连接,然后从他们自己的单独文件夹运行迁移。这允许您将迁移存储在单独的文件夹中,以便您轻松管理它们。
您的迁移与正常情况完全相同。
数据库连接
为了使这些迁移工作,我们需要配置数据库连接。我们将像正常一样定义database.yml
中的所有内容,但使用不同的命名约定:
db1:
development:
adapter: mysql2
database: db1_dev
username: root
test:
adapter: mysql2
database: db1_test
username: root
production:
adapter: mysql2
database: db1_prod
username: root
db2:
development:
adapter: mysql2
database: db2_dev
username: root
test:
adapter: mysql2
database: db2_test
username: root
production:
adapter: mysql2
database: db2_prod
username: root
这里我们配置了两个单独的数据库db1
和db2
。
我们需要配置我们的应用程序现在加载它们。我通常在boot.rb中执行此操作,但如果您使用的是Rails,则可能会在您的application.rb或环境文件中使用。
ENV['ENV'] ||= 'development'
db_conf = YAML::load(File.open(File.join(APP_PATH,'config','database.yml')))
DB1_CONF = db_conf["db1"][ENV['ENV']]
DB2_CONF = db_conf["db2"][ENV['ENV']]
所以在这里,让我们来看看发生了什么:
连接模型
当您使用多个数据库时,我喜欢在模型本身内部显式设置连接,而不是继承ActiveRecord :: Base并使用子类。
class Message < ActiveRecord::Base
establish_connection DB1_CONF
end
我们在另一个数据库中的第二个模型:
class User < ActiveRecord::Base
establish_connection DB2_CONF
end
<强>结论强>
这很简单。您真正需要做的就是加载配置,正确建立数据库连接,并设置迁移以从每个数据库的特定文件夹加载。
我确定有更好的处理方式,所以如果您有任何建议,请在评论中告诉我们!