2009-10-09 16 views
12

Voglio una migrazione per creare un clone di una tabella esistente semplicemente suffisso il nome, inclusi tutti gli indici della tabella originale.Come si può clonare una tabella di database tramite la migrazione di Rails?

Quindi c'è una tabella "istantanee" e voglio creare "snapshots_temp" come una copia esatta della tabella (non i dati, solo lo schema della tabella, ma compresi gli indici).

Potrei semplicemente copiare e incollare il blocco fuori dal file schema.rb e rinominarlo manualmente.

Ma non sono sicuro quando questa migrazione verrà applicata se la definizione da schema.rb sarà ancora accurata. Un altro sviluppatore potrebbe aver cambiato la tabella e non voglio dover aggiornare il mio script di migrazione.

Quindi, come posso ottenere lo schema della tabella in fase di esecuzione? In sostanza, in che modo "rastrella schema: dump" esegue il reverse engineering della tabella in modo da poter fare lo stesso nella mia migrazione? (ma cambiando il nome della tabella).

risposta

21

Provare a farlo con SQL puro. Questo farà quello che vuoi:

CREATE TABLE new_tbl LIKE orig_tbl; 
+0

Buona chiamata. "Usa LIKE per creare una tabella vuota in base alla definizione di un'altra tabella, inclusi gli attributi di colonna e gli indici definiti nella tabella originale" http://dev.mysql.com/doc/refman/5.1/en/create-table. html –

+0

Funziona con MySQL (e possibilmente con la maggior parte dei database) ma se usi Sqlite, non funzionerà. Mi sono imbattuto in questo problema nell'ambiente di sviluppo. La produzione va bene (è MySQL). – MiniQuark

+1

Grazie fantastici. Si noti che la tabella copiata otterrà gli indici, ma non le chiavi esterne. Dovrai ricreare quelli separatamente. –

4

Questo farà. Non è perfetto, perché non copia le opzioni o gli indici del tavolo. Se hai impostato qualsiasi opzione di tabella, dovrai aggiungerli manualmente a questa migrazione.

Per copiare gli indici è necessario formulare una query SQL per selezionarli e quindi elaborarli in nuove direttive add_index. Questo è un po 'oltre la mia conoscenza. Ma questo funziona per copiare la struttura.

class CopyTableSchema < ActiveRecord::Migration 
    def self.up 
    create_table :new_models do |t| 
     Model.columns.each do |column| 
     next if column.name == "id" # already created by create_table 
     t.send(column.type.to_sym, column.name.to_sym, :null => column.null, 
      :limit => column.limit, :default => column.default, :scale => column.scale, 
      :precision => column.precision) 
     end 
    end 

    # copy data 

    Model.all.each do |m| 
     NewModel.create m.attributes 
    end 
    end 

    def self.down 
    drop_table :new_models 
    end 
end 
+0

> non copierà le opzioni o gli indici della tabella Grazie, ma gli indici sono un requisito. –

4

In Rails 4 & PostgreSQL, creare una nuova migrazione e inserire:

ActiveRecord::Base.connection.execute("CREATE TABLE clone_table_name AS SELECT * FROM source_table_name;") 

questo creerà il clone con l'esatta struttura della tabella originale e popolare la nuova tabella con vecchi valori.

Maggiori informazioni: http://www.postgresql.org/docs/9.0/static/sql-createtableas.html

+1

Attento a questo dato che copierà anche la colonna ID e non la imposterà come primaria nella nuova tabella. –

0

copiare la voce tabelle dai progetti db/schema.rb direttamente nel tuo migrazione. Basta cambiare il nome del tavolo e il tuo buono per andare.

Problemi correlati