Rastrella una sola migrazione


94

Sto cercando di eseguire solo una migrazione da un intero gruppo nella mia app rails. Come posso fare questo? Non voglio eseguire nessuna delle migrazioni prima o dopo di essa. Grazie.


1
Questa sarebbe una comoda funzionalità di rails: aggiungi un STEP=nargomento a db:migrate(dov'è nil numero di migrazioni da eseguire, proprio come c'è per db:rollback) - quindi potresti fare rake db:migrate STEP=1o rake db:migrate STEP=2, ecc.
user664833

Risposte:


164

rake db:migrate:redo VERSION=xxxxxxx, ma verrà eseguito il passaggio downe quindi il uppassaggio. Puoi farlo insieme a commentare temporaneamente il passaggio in basso.


Hmm, blog.stonean.com/2007/12/18/rake-dbmigrateredo , :: redo non sembra accettare un argomento VERSION.
Terry G Lorber

3
@pedrorolo: questo non è obsoleto. Questa attività non ha una descrizione e quindi non verrà visualizzata in rake -T.
Ryan Bigg

1
@pedrorolo: db:test:prepareinoltre non compare in quella lista. Dio, sono in ritardo alla festa.
mraaroncruz

9
Per espandere ciò che dice Ryan, se la tabella è stata eliminata dal database al di fuori di Rails, rake db:migrate:up VERSION=my_versionpotrebbe non fare nulla , perché la tabella schema_migrations dice ancora che è stata eseguita. Nella stessa situazione rake db:migrate:redo VERSION=my_versionpotrebbe non riuscire perché non può cadere la tabella. In questo caso, commenta downtemporaneamente il metodo nella migrazione e rieseguirake db:migrate:redo...
Leone

3
E per espandere ciò che dice @Leo, se la migrazione è definita con def change, modificala in def self.up in aggiunta a quanto sopra.
valk

70
rake db:migrate:up VERSION=1234567890

allo stesso modo rake db:migrate:downper eliminare una migrazione specifica. Puoi ottenere un elenco delle attività di rake disponibili con rake -T.


4
Il VERSIONmenzionato qui è il valore intero all'inizio di ciascuno dei tuoi file di migrazione (che è solo il timestamp di quando è stato creato). Ad esempio VERSION=20150720023630,.
codifica aaron

3
Le versioni vengono visualizzate bene con rake db: migrate: status
jpgeek

Degno di nota, VERSIONè solo una variabile d'ambiente, quindi può essere la prima nel comando o addirittura impostata prima del comando:VERSION=1234567890 rake db:migrate:up
Joshua Pinter

25

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

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

Più utilmente questo potrebbe essere messo in un compito di rake ecc.


6
Questo ha funzionato in modo incredibile. Puoi anche semplicemente copiare e incollare il codice dalla migrazione nella console per definire la classe (e questo consente la manipolazione manuale se necessario, se hai appena fatto un errore su Dev, per esempio). Se hai definito una migrazione reversibile con change, esegui YourMigrations.migrate(:up)invece (o :downanche
tu

1
potresti doverrequire "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2

15

rake db:migrate:up VERSION=version_no

Migrerà (aggiungerà) uno script di migrazione specifico

rake db:migrate:down VERSION=version_no

Eliminerà lo script di migrazione specifico


10
rake db:migrate VERSION=20098252345

provalo.


7
Penso che questo eseguirà tutte le migrazioni fino a quella specificata.
Ken Liu

1
close, ma che esegue anche eventuali migrazioni prima della migrazione specifica.
Anon

6
Non penso che dovresti / vuoi eseguire solo una migrazione senza considerare quelle precedenti. Una migrazione è una rappresentazione della struttura del database in quanto si riferisce al codice in un dato momento, e quindi le migrazioni prima che siano necessarie. Se vuoi eseguire solo una migrazione, è probabile che tu non abbia scritto le corrette operazioni su / giù per mantenere le migrazioni funzionali ... è una cattiva abitudine scrivere solo le tue migrazioni.
JP Silvashy,

1
Degno di nota: VERSIONè solo una variabile di ambiente, quindi può essere la prima nel comando o addirittura impostata prima del comando:VERSION=20098252345 rake db:migrate
Joshua Pinter

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

Ricorda di mettere le virgolette intorno a xxxx, xxxx è il timestamp (o ID migrazione) per la tua migrazione.

Puoi controllare i timestamp (ID migrazione) per le migrazioni precedenti che hai eseguito utilizzando

rake db:migrate:status    

3

Espandere la risposta di korch sopra, requirenon ha funzionato per me, ma loadha funzionato. 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 funzionato per me.

    > Race.new.min_quantity # => 0 

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


2

Aggiungendo il mio 2 ¢ a questo perché ho riscontrato lo stesso problema:

Se desideri assolutamente eseguire di nuovo una migrazione senza crearne una nuova, puoi procedere come segue:

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

E rails "dimenticherà" di aver eseguito la migrazione per 20150105181157. Ora, quando esegui db: migrate, lo eseguirà di nuovo.

Questa è quasi sempre una cattiva idea però. L'unico caso in cui potrebbe avere senso è se hai un ramo di sviluppo e non hai ancora arricchito la tua migrazione e vuoi aggiungere alcune cose in fase di sviluppo. Ma anche in questo caso è meglio eseguire la migrazione bidirezionale in modo da poter eseguire correttamente il rollback e riprovare ripetutamente.


1

Ci deve essere un modo per eseguire la classe di migrazione tramite la console. Non riesco a ottenere il codice di migrazione per essere riconoscibile.

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

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

Copiare e incollare il codice nella migrazione a script / console?



0

Uso questa tecnica in fase di sviluppo quando modifico una migrazione di una quantità significativa e non voglio migrare verso il basso di una tonnellata e perdere dati in quelli lungo il percorso (specialmente quando sto importando dati legacy che richiedono molto tempo che Non voglio dover reimportare di nuovo).

Questo è 100% hack e sicuramente non consiglierei di farlo in produzione, ma farà il trucco:

  1. Sposta la migrazione che desideri rieseguire dalla sua directory in una posizione temporanea
  2. Genera un'altra migrazione con lo stesso nome
  3. Copia / incolla il codice di migrazione originale nel file di migrazione appena generato
  4. Esegui la nuova migrazione
  5. Elimina il file di migrazione appena generato
  6. Modifica le migrazioni dello schema per rimuovere il valore più recente
  7. Ripristina il vecchio file di migrazione
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.