2012-03-07 4 views
11

Ho finito con 9 migrazioni effettivamente duplicate. (Penso che questo sia dovuto al fatto che ho installato/aggiornato Gem e/o effettuato le migrazioni su entrambi i miei sviluppatori e macchine di produzione, ma non sono completamente sicuro in questa fase.)Migrazioni contrassegni rotaie come migrate

Ho spostato un set di 9 duplicati da le rotaie directory sul server di produzione, ma ora che voglio db:migrate sulla produzione, al fine di eseguire un altro la migrazione, sto diventando:

$ bundle exec rake db:migrate RAILS_ENV=production 
[DEPRECATION WARNING] Nested I18n namespace lookup under "activerecord.attributes.checkout" is no longer supported 
== CreatePages: migrating ==================================================== 
-- create_table(:pages) 
rake aborted! 
An error has occurred, all later migrations canceled: 

Mysql2::Error: Table 'pages' already exists: CREATE TABLE `pages` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `title` varchar(255), `body` text, `slug` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB 

Questo perché le migrazioni hanno effettivamente già stati eseguiti.

Preferisco evitare di fare db:migrate:down e db:migrate:up per ognuno - penso che questo significherà che i dati nel database di produzione sono persi. (In questo caso un paio di pagine statiche in Spree.)

C'è un modo per dire a questa installazione di Rails di dimenticare tutte le migrazioni in sospeso, contrassegnando in modo efficace tutte le migrazioni in sospeso come fatto?

risposta

6

È possibile aggiungere i timestamp delle migrazioni alla tabella schema_migrations. Tuttavia, perché manca quella tabella dal database o mancano le righe di cui ha bisogno?

È probabile che questa particolare migrazione sia stata completata a metà e non sia andata a buon fine, quindi quando si sta tentando di eseguirlo nuovamente la prima parte della migrazione non funzionerà come è stato fatto in precedenza. Questa è una limitazione di MySQL in quanto non è possibile eseguire il rollback delle modifiche alla migrazione che falliscono in parte. Postgres d'altra parte può ripristinare le modifiche strutturali al database evitando questo problema.

+0

Grazie - sembra che dovrebbe fare il trucco. Farò un tentativo. Penso di essere in questa situazione perché le 9 migrazioni coinvolte sono state create una volta ciascuna su entrambe le mie macchine dev e prod (quindi quella che è effettivamente la stessa migrazione ha due migrazioni ciascuna con il proprio timestamp). I primi 9 sono stati eseguiti, ma in seguito ne ho estratto altri 9 dalla mia macchina di sviluppo, quindi il reclamo sul tavolo già esistente. Mi sto ancora occupando dell'installazione e dell'aggiornamento delle gemme per quanto riguarda l'implementazione. –

+0

Ehm, perché hai migrazioni duplicate uguali ma con timestamp diversi? L'idea alla base delle migrazioni è che hai una serie di migrazioni (cioè modifiche alla struttura del database) che tutti usano. Il database dispone quindi di una tabella per tenere traccia delle migrazioni che sono già state eseguite, pertanto non verranno eseguite due volte su ciascun ambiente (dev/produzione). –

+0

Infatti. Penso che questo potrebbe essere perché in precedenza ho installato Gems (incluse le relative migrazioni) su entrambe le macchine senza rendermene conto. Devo ordinare il flusso di lavoro. –

8

Per impostazione predefinita, rake db:migrate esegue tutte le migrazioni in sospeso. Quindi, al fine di ottenere le vostre migrazioni giuste .. per il bene ..commentare quelle migrazioni e poi riportarle alla normalità. Assicurerà che tu stia bene nelle future migrazioni.

10

ho risolto in questo modo:

  1. Vai file di migrazione in conflitto.

  2. Cancellare il contenuto e salvarlo.

  3. Run rake db:migrate

  4. il file allo stato precedente Ctrl + Z.

Questo era un caso speciale, perché avevo copiato il DB da un'altra app, e avevo migrazioni in conflitto e cose del genere.

+0

sì, questo è un ottimo lavoro. Grazie. Ma mi chiedo ancora se ci siano altre soluzioni per questo. –

+3

Volevo aggiungere un chiarimento: non cancellare l'intero contenuto. Basta cancellare tutto tra la dichiarazione della classe e terminare. L'eliminazione di tutto comporterà questo errore a causa di una mancata corrispondenza tra nome file e nome classe: http://stackoverflow.com/questions/17776900/error-on-dbmigrate-uninitialized-constant-devisecreateusers – Dreyfuzz