2010-11-07 17 views
495

Possiedo un database Ruby on Rails pieno di dati. Voglio cancellare tutto e ricostruire il database. Sto pensando di utilizzare qualcosa del tipo:Elimina o ricrea un database Ruby on Rails

rake db:recreate 

È possibile?

+0

Suggerisco di guardare oltre la risposta con voto più alto. Secondo me 'rake db: drop db: create db: schema: load' potrebbe essere più appropriato di' rake db: drop db: create db: migrate' (anche se sono pronto a sbagliarmi). –

+0

Possibile duplicato di [Reimposta il database (elimina tutto), quindi avvia un database] (http://stackoverflow.com/questions/4003978/reset-the-database-purge-all-then-seed-a-database) – akostadinov

risposta

939

Conosco due modi per farlo:

Questo resetta il database e ricaricare lo schema corrente con tutti:

rake db:reset db:migrate 

Questo distruggerà il tuo database e quindi lo creerà e quindi migrerà lo schema corrente:

rake db:drop db:create db:migrate 

Tutti i dati andranno persi in entrambi gli scenari.

+31

Sembra che 'rake db: reset' esegua anche tutte le migrazioni (almeno su Rails 3), quindi dovrebbe essere tutto ciò che è necessario, giusto? – plindberg

+0

O, piuttosto, lascia lo schema identico a quello che avrebbe eseguito tutte le migrazioni.Ma le migrazioni non vengono eseguite di per sé (quindi se si hanno migrazioni che inseriscono dati, ciò non accadrà, per questo, si dovrebbe davvero usare un file db/seeds.rb). – plindberg

+3

Dovrebbe aver modificato la tua risposta. – Sufendy

24

A seconda di cosa hai intenzione, è possibile utilizzare ...

rake db:create

... per costruire il database da zero da config/database.yml, o ...

rake db:schema:load

... per costruire il database da zero dal tuo file schema.rb.

+0

che dice solo che "esiste già" – AnApprentice

+1

Devi prima eliminare il database ... oppure puoi semplicemente eliminare i tavoli se preferisci. – coreyward

+4

+1 per il caricamento dello schema. a volte le migrazioni vengono incasinate, ma lo schema dovrebbe essere quello che viene mantenuto intatto. – Danny

37

Uso il seguente supporto in Terminal.

rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare 

ho messo questo come un alias di shell e lo ha chiamato remigrate

+12

Eseguirà tutte le migrazioni una dopo l'altra, che non è scalabile ed è soggetta a errori. Inoltre, sono abbastanza sicuro db: migrate update your schema.rb, quindi lo schema: dump non sta facendo nulla di utile. – coreyward

+0

quindi come si fa a svuotare il database? in fase di sviluppo ... chiarire tutto. – AnApprentice

+3

@AnApprentice È possibile eseguire 'db: reset', che è solo un Google (o controllare le [Guide] (http://guides.rubyonrails.org)) di distanza. Il mio commento non era di sconsigliarvi di usarlo, ma di evitare l'uso di 'db: migrate' quando quello che volete veramente è' db: schema: load'. – coreyward

0

Oggi ho apportato alcune modifiche allo schema delle mie rotaie. Mi sono reso conto che avevo bisogno di altri due modelli in una gerarchia e di altri da eliminare. C'erano molte piccole modifiche richieste ai modelli e ai controller.

ho aggiunto i due nuovi modelli e li creato, utilizzando:

rake db:migrate 

Poi ho modificato il file schema.rb. Ho rimosso manualmente i vecchi modelli che non erano più necessari, ho cambiato il campo della chiave esterna come richiesto e ho semplicemente riordinato un po 'per renderlo più chiaro. I cancellato tutte le migrazioni, e poi ri-fatto funzionare l'accumulo tramite:

rake db:reset 

ha funzionato perfettamente. Tutti i dati devono essere ricaricati, ovviamente.Rotaie realizzato le migrazioni erano stati cancellati e ripristinare il marchio di alta marea:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"]) 
6

È possibile utilizzare questa seguente riga di comando:

rake db:drop db:create db:migrate db:seed db:test:clone 
2

Secondo Rails guide, questo uno di linea dovrebbe essere usato perché sarebbe carico dal schema.rb invece di ricaricare la migrazione file uno per uno:

rake db:reset 
7

Si può fare manualmente:

rake db:drop 
rake db:create 
rake db:migrate 

O semplicemente rake db:reset, che si svolgerà i passaggi precedenti, ma anche eseguire il file db/seeds.rb.

Una sfumatura aggiunta è che lo rake db:reset carica direttamente dal file schema.rb anziché eseguire nuovamente tutti i file di migrazione.

I dati vengono spazzati via in tutti i casi.

4

Per escludere un particolare database, è possibile farlo su console rotaie:

$rails console 
Loading development environment 
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>) 
1.9.3 > exit 

E poi migrare DB di nuovo

$bundle exec rake db:migrate 
9

Dalla corsa riga di comando

rake db:migrate:reset 
137

On Rails 4, tutto necessario è

$ rake db:schema:load 

Questo eliminerebbe l'intero contenuto del DB e ricreare lo schema dal file schema.rb, senza dover applicare tutte le migrazioni una alla volta.

+5

funziona anche per le rotaie 3. utile quando hai incasinato il tuo database di test e vuoi ripristinarlo in una versione funzionante che corrisponde al tuo dev db – Edmund

+0

Grazie per questo. Non mi ero reso conto che 'db: drop' e' db: create' erano ridondanti. –

+3

Questo non aggiorna lo schema, non è un modo sicuro se si effettua il refactoring delle migrazioni. –

11

Basta rilasciare la sequenza dei passi: eliminare il database, quindi ricreare di nuovo, la migrazione dei dati, e se si dispone di semi, seminare il database:

rake db:drop db:create db:migrate db:seed 

Poiché l'ambiente di default per rake è sviluppo, nel caso in cui se si vede l'eccezione nei test spec, è necessario ricreare db per l'ambientetest come segue:

RAILS_ENV=test rake db:drop db:create db:migrate 

in più c Poiché il database di test viene seminato durante le procedure di test, non è necessario inoltrare l'azione del task db:seed.In caso contrario, si dovrà preparare il database:

rake db:test:prepare 

o

RAILS_ENV=test rake db:seed 

Inoltre, per utilizzare il ricreare compito è possibile aggiungere nella Rakefile il seguente codice:

namespace :db do 
    task :recreate => [ :drop, :create, :migrate ] do 
     if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/ 
     Rake::Task[ 'db:seed' ].invoke 
     end 
    end 
end 

Quindi emissione:

rake db:recreate 
11

Usa come

rake db:drop db:create db:migrate db:seed 

Tutto in una sola riga. Questo è più veloce poiché l'ambiente non viene ricaricato più e più volte.

db: drop - farà cadere il database.

db: creare - creerà banca dati (host/db/password sarà preso da config/database.yml)

db: migrate - si svolgerà migrazioni esistenti dalla directory (db/migration/ .rb) *.

db: seed - verrà eseguito i dati di semi possibili dalla directory (db/migrazione/seed.rb) ..

Io di solito preferisco:

rake db:reset 

a fare tutto in una volta .

Cheers!

+1

Mi piace aggiungere db: test: preparati a questo, per buona misura. Ciò dipende, naturalmente, dal fatto che tu stia testando o meno. – ctc

28

Aggiornamento: Con l'avvento di Rails 5, questo comando sarà accessibile tramite questo comando:

rotaie db: spurgo db: creare db: migrate RAILS_ENV = test


A partire dalla più recente Rails 4.2 versione è ora possibile eseguire:

rake db:purge 

Fonte: commit

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases." 
    task :purge => [:load_config] do 
    ActiveRecord::Tasks::DatabaseTasks.purge_current 
    end 

Può essere usato insieme come menzionato sopra:

rake db:purge db:create db:migrate RAILS_ENV=test 
+0

Come dice @bekicot in inglese in chiaro 'db: purge'" rimuove tutti i dati ma conserva tutta la tabella e le colonne " – MCB

+0

@MCB Ho sbagliato, sory a riguardo,' db: purge' non sta preservando le tabelle. – Yana

4

Sulle rotaie 4.2, per rimuovere tutti i dati, ma conserva il database

$ bin/rake db:purge && bin/rake db:schema:load 

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md

+0

Beh ... l'ho provato, ma non conserva tabelle e colonne. Devi eseguire un db: migrare dopo aver eseguito un db: purge. Quindi questo non conserva tabelle e colonne. Conserva comunque il database stesso in modo da non dover db: creare – Cedric

+1

@Cedric Hai ragione, db: purge non conserva la tabella. Ho aggiornato il codice. – Yana

1

Poiché in fase di sviluppo, sarà sempre voglia di ricreare il database, è possibile definire un task rake in lib/cartella Attività del genere.

namespace :db do 
     task :all => [:environment, :drop, :create, :migrate] do 
    end 
end 

e nel terminale verrà eseguito

rake db:all 

sarà ricostruire il database di

1

Penso che il modo migliore per eseguire questo comando:

**rake db:reset** it does db:drop, db:setup 
rake db:setup does db:create, db:schema:load, db:seed 
3

È possibile utilizzare db:reset - per eseguire db: drop e db: setup o db:migrate:reset - che esegue db: drop, db: create e db: migrate.

dipendente da utilizzare esiste schema.rb