Benim schema.rb kaybetti! Yenilenebilir mi?


133

Bazı dağıtım sorunları nedeniyle git schema.rb izlemeyi bıraktım. Her nasılsa bu kadar ve bir yerde benim schema.rb dosya kayboldu boyunca doldurulmuş.

Schema.rb dosyasını veritabanından veya geçişlerden yeniden oluşturmanın bir yolu var mı? Mevcut verileri kaybetmemeyi tercih ederim.

Yanıtlar:


230

Bir çalıştırırsanız rake -T, Rails projeniz için olası tüm komisyon görevlerini listeler. Bunlardan biri , Rails uygulaması için schema.rb'yi veritabanından yeniden oluşturacak olan db: schema: dump .

bundle exec rake db:schema:dump

Çok teşekkürler, birçok cevap ama ilk (sadece) öyleymiş gibi görünüyor, bu yüzden sizin için işaretleyin. Sadece merak ediyorum, bu şemayı veritabanından mı yoksa geçişlerden mi oluşturuyor?
Brad

7
Veritabanının kendisinden, taşıma işleminin dışında gerçekleşen değişiklikler varsa dikkatli olun.
mguymon

1
schema.rb hala rake db:schema:dumpraylar 2.0 sonra boş şema içeriyor
Will Hardwick-Smith

Benim schema.rb dosya yukarıdaki komutları çalıştırdıktan sonra tamamen aynı kalır
stevec

59

Dikkatli,

rake db:schema:dump

geçerli DB şemasını DB'den atar . Eğer göçler herhangi bir değişiklik yapılmış, bu araçlar, onlar olacağı DEĞİL IMO istediğini olmadığı schema.rb dosyasında yansıtılacaktır.

Şemayı taşıma işlemlerinden yeniden oluşturmak istiyorsanız aşağıdakileri yapın:

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate

1
Bu OP'nin kaçınmak istediklerini söylediği veri kaybıyla sonuçlanacaktır. Ek olarak, Colin'in işaret ettiği gibi, veritabanını yalnızca göçlerden yeniden oluşturmak potansiyel olarak çok kötü bir fikirdir çünkü garip bağımlılık sorunlarına (genel olarak konuşulurken) gitme olasılığı artmaktadır. Bekleyen taşıma işlemleri varsa, bu son taşıma işlemlerini geliştirme makinesinde çalıştırmak ve ardından rake db:schema:dumpkomutu çalıştırmak en iyisidir .
Paul Richter

4
Cevabımda her tuval açıkça açıklanıyor. Sadece şema çalıştırarak TAMAMEN ısırdım: dökümü ve temiz bir şema almıyorum. OP şemayı bir CVS'de takip etmekten bahsediyor.
Şemamın

11
rake db:schema:dump

Bu Rails 3 hala geçerli olduğunu düşünüyorum - veritabanından schema.rb yeniden üretir.


8

RAYLAR 5 Yollu:

rails db:schema:dump

ya da Gem ile karşılaşırsanız :: LoadError :

bundle exec rails db:schema:dump

Not:

raylarda 5 görevin railsyerine kullanılarak üretilmesi / yürütülmesi tavsiye edilir rake, bu sadece hatırlamak içindir, oluşturulan raylar görev uzatma .rakebkz lib/tasks/myTask.rake. başka bir deyişle, bu görev, ekleyerek de yürütülebilir rake.


5

Eğer yenilenirsen schema.rbYerel olarak , iyi olmalısınız. Sadece veritabanı tablolarınızın yapısını temsil eder. Verilerin kendisi bu dosyada bulunmuyor.

schema.rbDosyanızı yeniden oluşturmak için şunu çalıştırın:

bundle exec rake db:schema:dump

Sonra sadece yeni schema.rbdosyayı taahhüt ve iyi durumda olması gerekir!


4

Doğrudan schema.rb dosyasının kendisinden:

Uygulama veritabanını başka bir sistemde oluşturmanız gerekiyorsa db:schema:load, tüm geçişleri sıfırdan çalıştırmamalısınız. İkincisi, kusurlu ve sürdürülemez bir yaklaşımdır (ne kadar çok göç toplarsanız, o kadar yavaş çalışır ve sorun olasılığı daha yüksektir).

Bu nedenle rake db:migrate, bu yazının yapıldığı sırada - en düşük puanlı cevapta önerilen öneriyi YAPMAYIN .


Şemayı yeniden oluşturmadan önce geliştirme makinenizde varsa, son birkaç beklemedeki taşıma işlemini çalıştırmak isteyebilirsiniz, ancak evet, özellikle veri kaybına neden olacağından, veritabanını yalnızca taşımalardan yeniden oluşturmak çok kötü bir fikirdir.
Paul Richter

1

Geçişi silsem bile eski şemanın yenilenmediği benzer bir sorunla karşılaştım.

Yani, yaptığım şey veritabanındaki tüm tabloları bırakmak ve tekrar taşımaktı. Sonra "db: schema: load" komutunu çalıştırmak yeni bir schema.rb verdi.

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.