Rails附加数据库

时间:2012-03-11 18:13:45

标签: ruby-on-rails ruby-on-rails-3 sqlite

是否可以在rails应用程序中附加两个数据库?例如,SQLite数据库是可移植的。我可以从另一台服务器下载SQLite数据库。当rails应用程序启动时,它会挂载数据库。我可以将其他数据库中的所有数据附加到现有数据库吗?可能是SQLite提供了一种合并数据库的方法吗?

2 个答案:

答案 0 :(得分:2)

我不确定你是说“在应用程序中添加数据库”是什么意思。但是,您可以在应用程序中使用2个不同的(具有不同方案)数据库。例如:

<强>配置/ database.yml的

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: project_dev
  pool: 5
  username: project
  password:

test:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: project_test
  pool: 5
  username: project
  password: 

sqlite:
  development:
    adapter: sqlite3
    database: db/development.project.db
    pool: 5
    timeout: 5000

  test:
    adapter: sqlite3
    database: db/test.project.db
    pool: 5
    timeout: 5000

<强>型号:

所有sqlite模型的抽象模型; 使用connection ninja gem

class SqliteModel < ActiveRecord::Base
  self.abstract_class = true
  use_connection_ninja(:sqlite)
end

Sqlite模型

class Book < SqliteModel
  set_table_name  :Books
  set_primary_key :BookID

  belongs_to  :volume,  :foreign_key => :VolumeID
  has_many :chapters,   :foreign_key => :BookID
end

Mysql模型

class Highlight < ActiveRecord::Base
  # ...
end

您甚至可以在不同数据库中的表之间使用关联。

但是如果你问的是使用2个具有相同方案的数据库(即只是不同的数据),那么我的答案是否定的,这是不可能的(尽管我可能是错的)。我认为这是一个关于复制,同步,备份或类似问题的问题 - 数据库层,而不是应用程序。

当然,您可以在两个数据库中拥有2个相同的表,2个模型 - 每个数据库一个,然后只需将记录从一个复制到另一个。但Rails不会自动执行此操作。

答案 1 :(得分:1)

如果您想使用来自外部来源(如中心位置)的数据“播种”数据库,最好的办法是:

  • 将此类数据提供为易于迭代的格式(如CSV,JSON或YAML);
  • 在应用初始化时将此数据合并到数据库中,前提是它不存在。

我在某些项目上做了类似的事情。但是,我不会自动执行合并:我宁愿使用db/seeds.rb文件和rake db:seed任务:

if State.count == 0
  State.transaction do
    CSV.foreach("#{::Rails.root}/db/seed_data/states.csv", 'r') do |row|
      code, acronym, name = *row
      State.create! code: code, acronym: acronym, nane: name
    end
  end
end

在此代码中,我从本地文件加载数据,但您可以使用Net::HTTP轻松更改为远程文件。