2009-08-25 5 views
73

Sto provando a eseguire solo una migrazione di un gruppo completo nella mia app di rotaie. Come posso fare questo? Non voglio eseguire alcuna migrazione prima o dopo di essa. Grazie.Rake una sola migrazione

+0

Questo sarebbe un comodo rotaie caratterizzato da: aggiungere un FASE = argomento 'n' a' db: migrate '(dove' n' è il numero di migrazioni da eseguire, proprio come avviene per 'db: rollback') - allora si potrebbe fare' rake db: migrate STEP = 1' o 'rake db: migrate STEP = 2', ecc. – user664833

risposta

141

rake db:migrate:redo VERSION=xxxxxxx, ma che eseguirà il passaggio down e quindi il up. Potresti farlo in concomitanza con il commentare temporaneamente il passaggio basso.

+0

Hmm, http://blog.stonean.com/2007/12/18/rake-dbmigrateredo/, :: redo non sembra prendere un argomento VERSION. –

+0

Funziona, l'ho provato. Si noti che l'articolo è da DUE MILLE E SETTE. Rails cambia molto durante questo periodo. –

+0

Allora perché Stackoverflow dovrebbe visualizzare informazioni obsolete? Se ora esegui 'rake -T' non ci sono task chiamati' db: migrate: redo' –

7
rake db:migrate VERSION=20098252345 

dare una prova.

+6

Penso che questo eseguirà qualsiasi migrazione fino a quella specificata. –

+1

chiudi, ma esegue anche eventuali migrazioni prima della migrazione specifica. – Anon

+4

Non penso che dovresti/vuoi eseguire solo una migrazione senza considerare quelli precedenti. Una migrazione è una rappresentazione della struttura dei database in relazione al codice in un determinato momento e quindi le migrazioni prima che sia necessario. Se si desidera eseguire solo una migrazione _one, è probabile che non abbiate scritto le corrette operazioni su/giù per mantenere le migrazioni funzionanti ... è una cattiva abitudine scrivere solo le vostre migrazioni. –

0

Deve esserci un modo per eseguire la classe di migrazione tramite la console. Non riesco a capire se il codice di migrazione è riconoscibile.

Tuttavia, come indicano i commenti, è preferibile eseguire le migrazioni in ordine. Utilizzare:

rake db:migrate VERSION=########## 

Copia e incolla il codice nella migrazione a script/console?

57
rake db:migrate:up VERSION=1234567890 

simile rake db:migrate:down di prendere una migrazione specifica verso il basso. È possibile ottenere un elenco delle attività di rake disponibili con rake -T.

+3

La 'VERSION' qui menzionata è il valore intero all'inizio di ciascuno dei tuoi file di migrazione (che è solo il timestamp di quando è stato creato). Ad esempio, 'VERSION = 20150720023630'. –

+1

Le versioni sono visualizzate bene con rake db: migrate: status – jpgeek

23

Ho dovuto eseguire una singola migrazione che è cambiata e doveva essere rieseguita indipendentemente da tutte le altre migrazioni. Accendi la console e fare questo:

>> require 'db/migrate/your_migrations.rb' 
=> ["YourMigrations"] 
>> YourMigrations.up 
=> etc... as the migration runs 
>> YourMigration.down 

Molto più utile questo potrebbe essere messo in un compito rake ecc

+6

Questo ha funzionato incredibilmente. Puoi anche copiare e incollare il codice dalla migrazione nella console per definire la classe (e questo consente la manipolazione manuale se necessario, ad esempio se hai appena fatto un errore su Dev). Se hai definito una migrazione reversibile con 'change', esegui' YourMigrations.migrate (: up) 'invece (o': down' too!) – trisweb

+0

potresti dover "richiedere" # {Rails.root}/db/migrate/your_migrations.rb "' – s2t2

6

rake db:migrate:up VERSION=version_no

migrerà (ADD) script di migrazione specifica

rake db:migrate:down VERSION=version_no

cancellerà script di migrazione specifica

3

Ampliando la risposta KORCH sopra, require fatto non funziona per me, ma load fatto. Per essere concreti, per il file di migrazione:

class ChangeMinQuantityToRaces < ActiveRecord::Migration 
     def change 
     change_column :races, :min_quantity, :integer, :default => 0 
     end 
    end 

nella console digitando

> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb' 
    > ChangeMinQuantityToRaces.new.change 

ha lavorato per me.

> Race.new.min_quantity # => 0 

Questo è stato per ruby ​​1.9.3p484 (2013/11/22 revisione 43786) [x86_64-linux] e Rails 3.2.13.

+0

Brillante, funziona perfettamente! – Loed

3
rake db:migrate:redo version='xxxx' 

Ricordarsi di inserire le virgolette attorno a xxxx, xxxx è il timestamp (o l'ID di migrazione) per la migrazione.

Check i timestamp (migrazione ID) per le migrazioni precedenti che hai fatto utilizzando

rake db:migrate:status  
1

Aggiunta miei 2 ¢ per questo perché mi sono imbattuto in questo stesso problema:

Se assolutamente consigliabile eseguire una migrazione più volte senza crearne uno nuovo, è possibile effettuare le seguenti operazioni:

rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

e rotaie volontà " dimentica "che ha eseguito la migrazione per 20150105181157. Ora quando esegui db: esegui la migrazione verrà eseguito di nuovo.

Questa è quasi sempre una cattiva idea. L'unica istanza in cui potrebbe avere senso è se si dispone di un ramo di sviluppo e non si è ancora sviluppata la migrazione e si desidera aggiungere alcune cose nello sviluppo. Ma anche in questo caso è meglio rendere la migrazione a 2 vie in modo da poter eseguire correttamente il rollback e riprovare ripetutamente.

0

Io uso questa tecnica in fase di sviluppo quando cambio una migrazione di una quantità significativa, e non voglio migrare una tonnellata e perdere dati in quelli lungo la strada (specialmente quando sto importando dati legacy che richiede da molto tempo che non voglio dover reimportare di nuovo).

Si tratta di hacker al 100% e non lo consiglio a fare questo in produzione, ma si farà il trucco:

  1. Sposta la migrazione che si desidera eseguire nuovamente fuori dalla sua directory a un posto provvisorio
  2. Generare un'altra migrazione con lo stesso nome
  3. Copia/incolla il codice di migrazione originale nel file di migrazione appena generato
  4. Eseguire il nuova migrazione
  5. Eliminare la nuova ge file di migrazione nerated
  6. Modifica i tuoi migrazioni schema per rimuovere il valore più recente
  7. Ripristinare il vecchio file di migrazione