我正在做一個數據庫恢復被銷燬的特定對象。其中大約有一百個。有沒有一個優雅的方式來執行此操作?尋找一種將櫻桃採摘的對象從一個數據庫複製到另一個數據庫的優雅方式
理想情況下,我很樂意做一個命令,例如:Object.where(attribute: 'condition')
,然後複製控制檯輸出,並能安慰到另一個數據庫,並創建我的所有對象關閉該輸出..
任何建議?
我正在做一個數據庫恢復被銷燬的特定對象。其中大約有一百個。有沒有一個優雅的方式來執行此操作?尋找一種將櫻桃採摘的對象從一個數據庫複製到另一個數據庫的優雅方式
理想情況下,我很樂意做一個命令,例如:Object.where(attribute: 'condition')
,然後複製控制檯輸出,並能安慰到另一個數據庫,並創建我的所有對象關閉該輸出..
任何建議?
如果你只是處理普通數據,你可以嘗試三種方法之一。
導出/導入CSV
純數據庫的方法是從你的各種表中選擇到你可以用它來以後重新加載在另一端導出文件。
例如:
SELECT ... FROM ... INTO OUTFILE 'export.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'
這在其他系統上的CSV格式的導出文件以後可以重新加載:
LOAD DATA INFILE 'export.csv' INTO TABLE ... FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'
這需要你的MySQL服務器直接訪問,但如果成功,速度非常快。 BINARY
或BLOB
類型字段不能與CSV一起使用,因爲它們與分隔符發生衝突。
導出/導入YAML
每一個模型能夠輸出本身系列化YAML的。基本上可以將所有需要的對象轉儲到一端,然後重新加載另一端。
File.open('dump.yml', 'w') do |f|
f.write(Object.where(:attribute => 'condition').all.to_yaml)
end
您可以在另一端重新加載這些:
File.open('dump.yml') do |f|
Object.transaction do
YAML.load(f).each do |attributes|
Object.create!(attributes)
end
end
end
的Object.transaction
部分意味着要麼被添加的所有記錄或沒有做的,所以如果有錯誤你可以糾正它並運行腳本再次沒有衝突。
SQL備份/恢復
的mysqldump
命令採用--where
的論點,即可以用來篩選記錄:
mysqldump database table --no-create-db --no-create-info --where `attribute='condition'` > table.sql
這應該剛剛INSERT
語句,但檢查以確保萬無一失。
您可以將備份數據庫添加到您的database.yml
,從中讀取對象,切換回主數據庫並重新創建缺失的對象。例如:
ActiveRecord::Base.establish_connection(:backup_database)
objects = Object.where(attribute: 'condition')
ActiveRecord::Base.establish_connection(:master_database)
objects.each { |object| Object.create! object.attributes }
如何將一個數據庫指向另一個數據庫? – Trip 2013-04-09 16:17:51
'backup_database'和'master_database'是'database.yml'中定義的數據庫,就像'development'或'production'一樣。 – Stefan 2013-04-09 16:21:03
好吧,但是從控制檯,我如何從其中一個數據庫中選擇對象,而在另一個對象中選擇Object.where ..時呢? – Trip 2013-04-09 16:47:17