tırmık db: şema: yük ve taşıma


171

Burada çok basit bir soru - bir uygulama daha karmaşık hale geldiğinde göçler yavaş ve külfetli hale gelebiliyorsa ve rake db:schema:loadbunun yerine çağrılacak daha temiz olursak , neden göçler var demektir?

Yukarıdakilerin cevabı, geçişlerin sürüm kontrolü (veritabanında yapılan değişikliklerin aşamalı kaydı) için kullanılması ise, bir uygulama daha karmaşık hale geldikçe ve rake db:schema:loaddaha çok kullanıldıkça, birincil işlevlerini korumaya devam ediyorlar mı?


Dikkat:

Bu sorunun yanıtlarından: bir üretim sunucusundaki rake db:schema:load verileri siler , bu yüzden kullanırken dikkatli olun.


5
+1 Göçlerin amacını hiç anlamadım; neden sadece versiyon şemayı kontrol etmiyor?
alternatif

5
@alternative - taşıma işlemleri, null olmayan bir sütun eklemeniz gerekiyorsa, bu sütunu varsayılan bir değer kullanmak yerine akıllıca veriyle doldurabileceğiniz gibi başka şeyler yapmanıza olanak tanır.
Josh

Yanıtlar:


208

Taşıma işlemleri, veritabanında ileri ve geri adım değişiklikleri sağlar. Üretim ortamında, dağıtımlar sırasında veritabanında artımlı değişiklikler yapılması gerekir: geçişler bu işlevselliği geri alma hatası sağlar. Eğer çalıştırırsanız rake db:schema:loadbir üretim sunucusuna, tüm üretim verilerini silme bitireceğiz. Bu içine girmek tehlikeli bir alışkanlık.

Bununla birlikte, zaman zaman göçleri "çökertmenin" iyi bir uygulama olduğuna inanıyorum. Bu, eski taşıma işlemlerini silmeyi, bunları tek bir taşıma işlemiyle değiştirmeyi ( schema.rbdosyanıza çok benzer ) ve schema_migrationstabloyu bu değişikliği yansıtacak şekilde güncellemeyi gerektirir . Bunu yaparken çok dikkatli olun! Dikkatli olmazsanız üretim verilerinizi kolayca silebilirsiniz.

Bir yan not olarak, taşıma dosyalarına asla veri oluşturmamanız gerektiğine inanıyorum. seed.rbDosya bu kullanılan veya özel tırmık veya dağıtma görevleri edilebilir. Bunu taşıma dosyalarına koymak, veritabanı şeması belirtiminizi veri belirtiminizle karıştırır ve geçiş dosyalarını çalıştırırken çakışmalara yol açabilir.


80
komisyon db: şema: load tüm üretim verilerini sildiğini bildirdiğiniz için teşekkür ederiz!
Magne

2
"Daraltılmış" geçişleri, şemayı taklit eden yenisiyle değiştirmek yerine, yalnızca bunları temizleyen bir mücevher yazdım ve kullanıcılardan yeni bir yüklemeye karşı db:schema:loadçalıştırmaya çalıştıklarında onları kullanmalarını isterim db:migrate. @ clear_migrations
Yarin

Muhtemelen bariz bir cevap ama üretime ilk kez basmadan önce, tüm geçişleri silmenizi ve ilk geçiş olarak db.schema kullanmanızı tavsiye eder misiniz?
dtc

30

Sadece bu yazı boyunca tökezledi, bu uzun zaman önceydi ve beklediğim cevabı görmedi.

rake db:schema:loadbir sistemi ilk kez üretime geçirdiğinizde harikadır. Bundan sonra normalde taşıma işlemi gerçekleştirmelisiniz.

Bu, aynı zamanda, istediğiniz zaman geçişlerinizi temizlemenize yardımcı olur, çünkü şema, geçişlerinizi temizlerken bile diğer makineleri üretime sokmak için tüm bilgilere sahiptir.


Böylece göçlerinizi "temizleyebilirsiniz" çünkü onları asla kullanmak zorunda kalmazsınız? Tuhaf bir ifade gibi geliyor.
Abe Petrillo

db:schema:loadGelişim döngüsü boyunca birkaç saniye tıraş olmaktan başka ne faydası olduğu bana açık değil . Oluşturulması 30 saniyeden uzun süren bir uygulamayla hiç çalıştınız mı? Şu anda onun göç dosyalarında hataları olan bir uygulama üzerinde çalışıyorum ve asla hata düzeltmeleri olmadan ya da çalışma db:schema:loadşeması düşündüren olmadan göç olmaz : yük bir şey uygulamanın gelişimi ile ilgili yanlış gittiğinde içindir.
Ninjaxor

Göçleri tutmak için yapacağım bir diğer tartışma, rayların çekirdek ekibinin kullanıcıları yönlendirmesidir instead of editing schema.rb, please use the migrations feature. Dolayısıyla db:schema:load, otomatik olarak yeniden oluşturulacak geçişlerinizin olmadığı otomatik olarak oluşturulmuş bir dosya üzerinde çalışıyorsanız , şemayı manuel olarak "düzenleme" ve taşıma işlemlerini devre dışı bırakma yoluna gidersiniz. Ben bu konuda raylar kılavuzundan bir alıntı olsaydı, ama onlar şema tartışmak değil: yük, şema: load özelliği nasıl yaklaşacağına karar verme benim hayal kırıklığı ekler. = /
Ninjaxor

Bu sayfaya tam olarak geldim çünkü buna katılıyorum. Deneyimlerim, site bir kez üretime girdiğinde, değiştirmek için taşıma işlemlerini kullanmak çok daha güvenli. Buna rağmen, db / schema.rb'nin başlangıcındaki yorumlar tam tersini belirtir! (Her projenin başında problemim var çünkü .gitignore'a db / schema.rb koymayı unutuyorum ...)
user1251840

@AbePetrillo wow Bu yorumları tamamen kaçırdım. Tabii ki hayır, demek istediğim, isterseniz tüm üretim makinelerinde çalıştırılan eski göçleri temizleyebilmeniz . Yıllar boyunca onları her zaman sakladım, ancak "istediğiniz zaman göçlerinizi temizlemenize yardımcı oluyor" ifadesi "asla göç kullanmam gerekmeyecek" anlamına gelmiyordu. Yani, yeni bir makine konuşlandırdığınızda, rake db:schema:loadaksine çalıştırın rake db:migrate. Sonra oradan yapabilirsiniz rake db:migrate.
ereslibre

9

Taşıma işlemleri db'ye de veri eklemenizi sağlar. ancak db: schema: load yalnızca şemayı yükler.


6

Çünkü taşıma işlemleri geri alınabilir ve ek işlevsellik sağlar. Örneğin, bazı verileri bir şema değişikliğinin parçası olarak değiştirmeniz gerekirse, bunu taşıma olarak yapmanız gerekir.


4

Diğer ORM'lerin bir kullanıcısı olarak, Rails'in 'senkronizasyon ve güncelleme' özelliği olmadığı her zaman garip görünüyordu. yani, şema dosyasını kullanarak (tüm, güncel şemayı temsil eder), varolan DB yapısını gözden geçirin ve tabloları, sütunları, dizinleri gerektiği gibi ekleyin / kaldırın.

Bana göre bu biraz daha yavaş olsa bile çok daha sağlam olurdu.


1
Veri içeren bir veritabanını karmaşık bir şemadan diğerine geçirme görevi bazen önemsiz değildir. Otomatik olarak çözümlenmeyebilir ve veriler tek adımda tutarlı bir şekilde taşınamayabilir. Rayların taşınması master ve şemaya bağlıdır. Şema her geçişle otomatik olarak yeniden oluşturulur, ancak tam tersi olmaz.
oklas

Rayların kendi kılavuzları schema, göçlerin değil, asıl olduğunu açıkça belirtir .
Drenmi

0

Zaten bir yorum olarak yayınladım, ancak db / schema.rb dosyasının yorumlarını buraya koymanın daha iyi olduğunu düşünüyor:

# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.

Aslında, deneyimim geçiş dosyalarını schema.rb dosyasına değil git'e koymak daha iyi ...


0

rake db:migrateveritabanındaki tabloları ayarlayın. Geçiş komutunu çalıştırdığınızda, db / migrate / dizininde yakut dosyaları arar ve bunları en eskisinden başlayarak yürütür. Her taşıma dosya adının başında bir zaman damgası vardır.

Bunun aksine rake db:migratehenüz çalışmayan taşıma işlemlerini çalıştırır, rake db:schema:loaddaha önce oluşturulan şemayı db/schema.rbveritabanına yükler .

Komisyon veritabanı komutları hakkında daha fazla bilgiyi burada bulabilirsiniz .

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.