2012-11-30 22 views
6

db'mi taşımaya çalıştığımda bir hata alıyorum. , Taşınan, usta döndüğünüzü ve Raylar DB Taşıma Hatası: ilişki zaten var

  • başka bir şube oluşturulmuş birleştirilmiş şube: Tamamen buraya nasıl hatırlamıyorum, ama ben inanıyorum:

    1. db yeni şube, sorularla desteklenen 'talepler' yarattı bazı şeyler yaptı, db: göç etti ve her şey iyi çalışıyordu.
    2. , heroku postgres veritabanından çektiği için, herhangi bir şeyin gerçek verilerle çalışıp çalışmadığını test edebilirdim. Daha sonra db göç çalıştı, ancak bana bu hatayı verdi:

      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) 
      

    Herhangi bir fikir?

  • +1

    Kapalı bir sıra oluşturma ile ilgili mesaj bir hata değil, yalnızca bir bildirim (bilgilendirme mesajı. Bu, aktif kaydın "id" sütunu için varsayılan olarak yapacağı bir otomatik artırım sütunu kullanan herhangi bir tablo için normaldir.Hata, 'request' tablonun zaten mevcut olmasıdır. – qqx

    +0

    Yani bu mesajı almam durumunda ne yapmalıyım? Tabloyu bırakmak için geçişler oluşturarak ve daha sonra aynı tabloyu oluşturmak için bir geçişi yeniden oluşturarak çözdüm. Daha iyi bir yolu var mı? – kibaekr

    +1

    Veritabanı şeması, tüm ortamların net sonucu olarak aynı ortamı varsayarak olacaktır. Dalları birleştirene kadar kodunuz, temelde db üzerinde gerçekte gerçekleşmiş olan geçiş dizilerini göstermez. Ve, geçişi çalıştırdığınızda, önceki geçişler için yapılan denetimler yalnızca olası uyuşmazlıklara karşı olası çatışmaları işaret edecek şekilde yapılır. Tüm taşıma işlemlerini tek bir şubede tutmanızı öneririm. –

    cevap

    4

    Sana kullanılan stratejiyi çekin tam olarak emin değilim, ama biz sizin çekme stratejisi hakkında iki makul varsayımlar yaparsanız: bu daha az gerektirir çünkü

    1. o sadece tablolar üzerine yazar veritabanını bırakma değil, izinleri.
    2. , bir tür 'arşiv modu' içinde çalışmaktadır, yani kaynakta bulunmadığı için hedefte tablolar düşmez. Rsync'i düşün; Bu yardımcı programla beklenen davranışınızın ne olabileceğini öğrenmek için --delete belirtmeniz gerekir.

    adımlarınız doğruysa, o zaman ne oldu size schema_migrations tablo overwrote, yani Raylar henüz tabloyu eklememiş düşünür ama ne senin Heroku çünkü yukarıda 2. tablosunu damla yatmış.

    Başka bir geçiş oluşturma! Bu, herkesin bilgisayarında sizinki haricinde başarısız olur, ancak sadece sizinkilerle çalışır.

    rails dbconsole dosyasını çalıştırın ve DROP TABLE 'requests' gibi bir işlevi yürütün (postgres sözdizimini unuttum, tam olarak böyle olmayabilir). Sonra geçişlerinizi çalıştırabilirsiniz.

    2

    İçinde veri bulunan bir tabloyu düşürmekten kaçınmanın başka bir yolu vardır.

    Bu gibi durumlarda yaptığım, hangi geçişin başarısız olduğunu kontrol etmektir.

    db/migrate/20130908214222_create_requests.rb numaralı bir dosyanız olduğunu varsayalım ve bir nedenden dolayı bu geçişi "izleme sistemi" nde saklandığında ActiveRecord geçmişte başarısız oldu.

    bu schema_migrations tabloda, sadece bulmak, vaka olduğundan emin olmak için, bu örnekte olduğu gibi bir sayı içeren bir satır: o satır yoksa 20130908214222

    , sadece bir yenisini eklemek zorunda : Eğer rake db:migrate çalıştırmak

    INSERT INTO schema_migrations(
        version 
    ) VALUES (
        20130908214222 
    ); 
    

    dahaki sefere ActiveRecord bu adımı atlamak olacak ve komplikasyon olmadan bitirmek için göç devam edecektir.

    İlgili konular