2012-11-30 28 views
6

Viene visualizzato un errore quando provo a migrare il mio db. Non del tutto ricordo come sono arrivato qui, ma credo:Errore migrazione Rails DB: la relazione esiste già

  1. creato nuovo ramo, 'Richieste' ponteggi, db: migrate, commutata al maestro, e il ramo fusione
  2. creato un altro ramo, ha fatto qualcosa, db: migrato, e tutto funzionava bene.
  3. estratto dal database di heroku postgres in modo da poter verificare se le cose funzionassero con dati reali. poi ha cercato db Migrare, ma mi ha dato questo errore:

    rake db:migrate 
    == CreateRequests: migrating ================================================= 
    -- create_table(:requests) 
    NOTICE: CREATE TABLE will create implicit sequence "requests_id_seq1" for serial column "requests.id" 
    rake aborted! 
    An error has occurred, this and all later migrations canceled: 
    
    PG::Error: ERROR: relation "requests" already exists 
    : CREATE TABLE "requests" ("id" serial primary key, "title" character varying(255), "content" text, "category" character varying(255), "status" character varying(255), "requested_track_id" integer, "created_at" timestamp, "updated_at" timestamp) 
    

Tutte le idee?

+1

Il messaggio sulla creazione di una sequenza implicita non è un errore, ma solo un avviso (un messaggio informativo.) Questo è normale per qualsiasi tabella che utilizza una colonna autoincrementante che il record attivo eseguirà di default per la colonna 'id'.L'errore è che la tabella 'requests' esiste già. – qqx

+0

quindi cosa farei nel caso in cui ricevo quel messaggio? L'ho risolto creando migrazioni per eliminare la tabella e quindi ricreando una migrazione per creare la stessa tabella. C'è un modo migliore? – kibaekr

+1

Lo schema del database sarà il risultato netto di tutti i rami, assumendo lo stesso ambiente. Finché non si uniscono i rami, il codice non mostrerà la serie di migrazioni effettivamente avvenute sul db sottostante. Inoltre, quando si esegue la migrazione, i controlli per le migrazioni precedenti verranno eseguiti solo rispetto alle migrazioni correnti, il che potrebbe indicare potenziali conflitti. Suggerirei di mantenere tutte le migrazioni in un ramo. –

risposta

4

io non sono sicuro di quello che tirare la strategia si è utilizzato, ma se facciamo due stima ragionevole la vostra strategia di tiro:

  1. non eliminare il database, ma solo sovrascrive le tabelle, dal momento che questo richiede meno permessi.
  2. funziona in una sorta di "modalità archivio", il che significa che non rilascia tabelle sulla destinazione solo perché non esistono sulla sorgente. Pensa a rsync; devi specificare --delete per ottenere quello che potrebbe essere il tuo comportamento previsto con quella utility.

Se i passaggi sono corretti, allora quello che è successo è che si sovrascritto tavolo schema_migrations, quindi Rails pensa che tu non hai ancora aggiunto il tavolo, ma nessuno dei due ha fatto la tua Heroku tirare cadere la tabella a causa di sopra # 2.

Non creare un'altra migrazione !!! Questo fallirà sul computer di tutti gli altri tranne sul tuo, ma funzionerà solo sul tuo una volta.

Invece, eseguire rails dbconsole ed eseguire qualcosa come DROP TABLE 'requests' (ho dimenticato la sintassi postgres, potrebbe non essere esattamente questo). Quindi puoi eseguire le tue migrazioni.

2

C'è un altro modo per evitare di far cadere una tabella con i dati al suo interno.

Quello che faccio in questi casi è controllare quale migrazione non funziona.

Supponiamo di avere un file db/migrate/20130908214222_create_requests.rb e, per qualche motivo, ActiveRecord non è riuscito in passato quando ha memorizzato questa migrazione nel suo "sistema di tracciamento".

Per essere sicuri che questo è il caso, basta trovare, nella tabella schema_migrations, una riga contenente un numero come in questo esempio: 20130908214222

Se quella riga non esiste, devi solo inserire una nuova :

INSERT INTO schema_migrations(
    version 
) VALUES (
    20130908214222 
); 

la prossima volta che si esegue rake db:migrate, ActiveRecord salterà questo passaggio, e continuerà la migrazione alla fine, senza complicazioni.

Problemi correlati