2012-04-12 44 views
1

假設我有2個數據庫,maintemp,我有一個ActiveRecord類Entry對應於一個entriesmain,我怎樣才能在temp創建類似的表。如何使用ActiveRecord將表複製到Rails中的另一個數據庫?

第一次刺戳使用Entry.connection.execute('show create table #{Entry.table_name}')並針對另一個表格調用該表。 (如果maintemp是同一種數據庫,則工作)。

有沒有更好的方法來做到這一點?最好是不涉及讀取調用「創建表」表達式的&。

例如,ActiveRecord :: Schema.define的東西似乎是最好的。但我不確定該怎麼做。

謝謝。

+0

你一定要明白,每一個方法最終會調用'秀創建table',對不對?你只是不想自己打電話嗎? :) – 2012-04-13 00:05:37

+0

@SergioTulentsev我假設ActiveRecord適配器將處理爲我創建表語法的細微差異。例如如果一個表是MySQL,另一個是SQLite。 – z5h 2012-04-13 00:11:01

回答

2

快速Google搜索後,我沒有找到現成的方法來實現這一點,沒有原始的SQL。但是,您可以通過模仿annotate_models的功能來制定自己的解決方案。

一塊從https://github.com/ctran/annotate_models/blob/master/lib/annotate/annotate_models.rb

# Use the column information in an ActiveRecord class 
# to create a comment block containing a line for 
# each column. The line contains the column name, 
# the type (and length), and any optional attributes 
def get_schema_info(klass, header, options = {}) 
    info = "# #{header}\n#\n" 
    info << "# Table name: #{klass.table_name}\n#\n" 

    max_size = klass.column_names.collect{|name| name.size}.max + 1 
    klass.columns.each do |col| 
    attrs = [] 
    attrs << "default(#{quote(col.default)})" unless col.default.nil? 
    attrs << "not null" unless col.null 
    attrs << "primary key" if col.name == klass.primary_key 

    col_type = col.type.to_s 
    if col_type == "decimal" 
     col_type << "(#{col.precision}, #{col.scale})" 

此外,你可能想讀什麼ActiveRecord Migrations Guide所提供的。

ActiveRecord::Schema.define(:version => 20080906171750) do 
    create_table "authors", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 
end 

該文件通過檢查數據庫,並使用CREATE_TABLE,add_index表達它的結構,等等創建。由於這是獨立於數據庫的,因此可以將其加載到Active Record支持的任何數據庫中。如果您要分發能夠針對多個數據庫運行的應用程序,這可能非常有用。

但是有一個折衷:db/schema.rb不能表示特定於數據庫的項目,例如外鍵約束,觸發器或存儲過程。在遷移過程中,您可以執行自定義SQL語句,但模式轉儲程序無法從數據庫重新構建這些語句。如果您正在使用這樣的功能,那麼您應該將模式格式設置爲:sql。

而不是使用Active Record的模式轉儲器,數據庫的結構將使用特定於數據庫的工具(通過db:structure:dump Rake任務)轉儲到db/structure.sql中。例如,對於PostgreSQL RDBMS,使用pg_dump實用程序。對於MySQL,這個文件將包含各種表的SHOW CREATE TABLE的輸出。加載這些模式只是執行它們包含的SQL語句的問題。根據定義,這將創建數據庫結構的完美副本。然而,使用:sql模式格式將阻止將模式加載到用於創建它的RDBMS之外。

1

如果你只想從一個數據庫移動到另一個,使用寶石「yaml_db」

+0

看起來很有意思。但是作爲中間人的yaml文件是不需要的。謝謝。 – z5h 2012-04-13 15:24:39

相關問題