2012-03-11 99 views
1

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

+0

你不应该在生产中使用SQLite,因为它不是为这种负载设计的。 – 2012-03-11 19:34:33

回答

2

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

的config/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 

型号:

所有源码模型抽象模型; 使用connection ninja宝石

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个数据库的方法(即只是不同的数据),那么我的答案是否定的,这是不可能的(尽管我可能是错的)。我认为这是一个关于复制,同步,备份或类似的问题 - 数据库层,而不是应用程序。

当然,您可以在两个数据库中都有两个相同的表,两个模型 - 每个数据库一个,然后只是将记录从一个复制到另一个。但Rails不会自动完成。

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