使用Rails多个数据库配置进行迁移

时间:2011-11-05 11:42:37

标签: ruby-on-rails ruby-on-rails-3 activerecord rails-migrations

我正在开发一个Rails应用程序,我将在其中使用2个不同的数据库。即一个用于存储用户凭证,另一个用于存储其他类型的数据。 我已经设置了我的database.yml文件,为每个环境接受2个不同的数据库。它看起来像这样:

<% %w(development test production).each do |env| %>
data_<%= env %>:
  adapter: sqlite3
  database: db/data/<%= env %>.sqlite3
  pool: 5
  timeout: 5000

users_<%= env %>:
  adapter: sqlite3
  database: db/users/<%= env %>.sqlite3
  pool: 5
  timeout: 5000
<% end %>

我还创建了2个级别的模型,每个模型连接一个,即:

class UsersBase < ActiveRecord::Base
  establish_connection "users_#{RAILS_ENV}"
end

class DataBase < ActiveRecord::Base
  establish_connection "data_#{RAILS_ENV}"
end

我在生成模型时遇到了一些问题,因为它无法找到标准的“开发”数据库,但我通过运行带有--parent选项的生成模型来解决这个问题。

但是,现在我在尝试运行rake db:migrate时遇到了问题。 rake任务找不到默认的开发数据库(按惯例,应该在database.yml中命名为development)。我的问题是,是否有可能以某种方式将此作为参数提供给rake任务,或者甚至更好地在配置脚本中的某处发出Rails信号,表明有2个数据库,或者开发数据库的默认名称是否已更改?

2 个答案:

答案 0 :(得分:1)

您正在定义这些数据库:

  1. data_development
  2. users_development
  3. data_test
  4. users_test
  5. data_production
  6. users_production
  7. Rails首先寻找与环境名称(开发,测试,生产)匹配的数据库定义。对于数据dbs,只需使用这些名称,就可以迁移数据db。

    <% %w(development test production).each do |env| %>
      <%= env %>:
      adapter: sqlite3
      database: db/data/<%= env %>.sqlite3
      pool: 5
      timeout: 5000
    
    users_<%= env %>:
      adapter: sqlite3
      database: db/users/<%= env %>.sqlite3
      pool: 5
      timeout: 5000
    <% end %>
    

    所有“data_X”dbs都只带有环境名称。这就是Rails所期望的,因此迁移将对它们起作用。

    这可能会让你感到寒冷,但是对于迁移用户dbs而言。我认为Rails迁移不是以这种方式使用 - 在一个环境中迁移2个dbs。

    那说,我会尝试一下。以下是与上面的database.yml更改所需的模型更改:

    class DataBase < ActiveRecord::Base
    end
    

    事实上,您可以完全取消DataBase,只需让以前的DataBase模型直接扩展ActiveRecord :: Base。

    有兴趣看看你试试看的内容。

答案 1 :(得分:0)

我为这个用例写了pg_migrate。您可以使用此项目在Rails应用程序之外定义模式,但仍然可以将其与Rails应用程序本机集成(pg_migrate可以输出'schema gem',这只是您的模式,类/ cli可以移植它)。使用它确实意味着在开发过程中删除db:migrate。

Web应用程序不一定“拥有”架构。此外,您可以使用多种语言进行编程。

仅限Postgres。