我正在开发一个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个数据库,或者开发数据库的默认名称是否已更改?
答案 0 :(得分:1)
您正在定义这些数据库:
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。