Ruby on Rails veritabanını temizleme veya yeniden oluşturma


582

Veri dolu bir dev Ruby on Rails veritabanım var. Her şeyi silmek ve veritabanını yeniden oluşturmak istiyorum. Şöyle bir şey kullanmayı düşünüyorum:

rake db:recreate

Mümkün mü?


En yüksek oyu verilmiş cevabı geçmenizi öneririm. Benim düşünceme rake db:drop db:create db:schema:loadgöre daha uygun olabilir rake db:drop db:create db:migrate(bu konuda yanlış olmaya hazır olmama rağmen).
Jason Swett


2
rake db:drop db:create db:migrate
William Hampshire

db:drop + db:create + db:migrate == db:migrate:reset. Genellikle db:schema:loadgöçler bozulduğunda başvururum. Ben nadiren veritabanı yeniden oluşturmak gerekir, bu yüzden hız çok önemli değil. Ayrıca, uygulanmayan taşıma işlemleriniz varsa db:schema:loadve db:resetbunları uygulamazsanız. Bunun büyük bir tartışma olup olmadığından emin değilim.
x-yuri

Yanıtlar:


1074

Bunu yapmanın iki yolunu biliyorum:

Bu, veritabanınızı sıfırlar ve mevcut şemanızı tümü ile yeniden yükler:

rake db:reset db:migrate

Bu, db'nizi yok eder ve sonra oluşturur ve ardından geçerli şemanızı taşır:

rake db:drop db:create db:migrate

Her iki senaryoda tüm veriler kaybolacaktır.


36
Aynı rake db:resetzamanda tüm geçişleri de yapıyor (en azından Raylar 3'te), bu yüzden gerekli olan her şey bu olmalı, değil mi?
plindberg

1
Ya da, daha ziyade, şemayı tüm göçlerin yürütülmesi ile aynı bırakır. Ancak taşıma işlemleri kendi başına çalıştırılmaz (bu nedenle veri ekleyen taşıma işlemleriniz varsa bu gerçekleşmez; bunun için gerçekten bir db / seeds.rb dosyası kullanmalısınız).
plindberg

1
Tracks GTD uygulaması db: migrate'ın çalışmadığını biliyorum. Sqlite3'ten Postgres'e geçerken db: reset yapmam gerekiyordu.
labirent

11
Ayrıca rake db:test:preparetest için çalıştırmanız gerekir , aksi takdirde şöyle bir hata alırsınız:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2

31
Birisi bunu açıkça belirtmeli rake db:resetve rake db:drop db:create db:migrate iki farklı şey yapmalıdır . İkincisi, tüm uygulama veritabanını siler, yeniden oluşturur ve şemayı ( db/schema.rbveya db/structure.sql) güncellemek için her geçişten geçer , ancak tohum verileriyle doldurmaz. Birincisi bunun takma adıdır rake db:drop db:schema:load db:seed, bu nedenle tüm uygulama veritabanını siler, ancak şemayı güncellemez ve daha sonra tohum verileriyle doldurulur. Dolayısıyla, taşıma işlemlerinizde hiçbir şeyi değiştirmediyseniz, birincisi daha hızlıdır, ikincisi daha güvenlidir.
Claudio Floreani

157

Rails 4'te gereken tek şey

$ rake db:schema:load

Bu, tüm geçişleri tek tek uygulamak zorunda kalmadan DB'nizdeki tüm içeriği siler ve şemayı schema.rb dosyanızdan yeniden oluşturur.


6
raylar 3 için de çalışır. sadece test veritabanınızı berbat ve dev db ile eşleşen bir çalışma sürümüne sıfırlamak istediğinizde
kullanışlıdır

Bunun için teşekkürler. Bunu fark etmedim db:dropve db:creategereksizdi.
Grant Birchmeier

3
Bu, şemayı güncellemez, taşıma işlemlerinizi yeniden düzenlerseniz güvenli bir yol değildir.
Claudio Floreani

bu benim için en iyi cevap.
roxdurazo

2
@ClaudioFloreani göçleri yeniden düzenleyerek sorun istiyor. Koştuktan sonra, kalıcı olarak yalnız bırakılmalıdırlar.
nrowegt

45

Terminalde aşağıdaki bir astarı kullanıyorum.

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

Bunu bir kabuk takma adı olarak koydum ve adlandırdım remigrate

Şimdiye kadar, Rails görevlerini kolayca "zincirleyebilirsiniz":

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+

12
Bu, tüm taşıma işlemlerinizi birbiri ardına gerçekleştirir, bu da ölçeklenebilir değildir ve hataya açıktır. Ayrıca, eminim db: migrate schema.rb'nizi günceller, böylece şemanız: dökümü faydalı bir şey yapmaz.
coreyward

peki veritabanını nasıl boşaltır? geliştiriliyor ... hepsini temizle.
AnApprentice

3
@AnApprentice db:resetSadece bir Google olan (veya Kılavuzları kontrol edin ) kaçabilirsiniz . Benim yorumum bunu kullanmamaya karşı tavsiyede bulunmak değildi, ama db:migrategerçekten ne istediğinizi kullanmaktan kaçınmaktı db:schema:load.
coreyward

7
Bu arada, @TK, bunların hepsini sonuncunun çıkış durumuna bağlı olarak ayrı işlemler olarak çalıştırmanız gerekmez. Bunun yerine, sadece için istenen tüm görevleri geçmek rakeşöyle: rake db:drop db:create db:schema:load.
coreyward

1
Bu anekdot, ama hiç bir sorunum olmadı db:migrate... oysa db:schema:loadyeni bir geçişin yanı sıra schema.rb'yi sürüm kontrolüne kontrol etmeyi unutan birine karşı hassas.
johncip

37

Güncelleme: Rails 5'de bu komuta şu komutla erişilebilir:

rails db:purge db:create db:migrate RAILS_ENV=test


En yeni raylar 4.2 sürümünden itibaren şunları çalıştırabilirsiniz:

rake db:purge 

Kaynak: taahhüt

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
  task :purge => [:load_config] do
    ActiveRecord::Tasks::DatabaseTasks.purge_current
  end

Yukarıda belirtildiği gibi birlikte kullanılabilir:

rake db:purge db:create db:migrate RAILS_ENV=test

@Bekicot plainer ingilizce dediği gibi db:purge"tüm verileri kaldırmak ama tüm tablo ve sütunları korumak"
MCB

@ MCB Yanılmışım, bunun için üzgünüm db:purge , masaları korumak değil.
Yana Agun Siswanto

29

Ne istediğinize bağlı olarak kullanabilirsiniz ...

rake db:create

… Veritabanını sıfırdan oluşturmak config/database.ymlveya…

rake db:schema:load

... veritabanını sıfırdan oluşturmak schema.rb.


1
Önce veritabanını bırakmanız gerekir… ya da isterseniz tabloları silebilirsiniz.
coreyward

5
Şema yükü için +1. bazen göçler berbat olur, ancak şema sağlam tutulan şey olmalıdır.
Danny

The Rails 3 Way 'de şemayı yüklemenin, tüm geçişleri yürütmenin aksine, gitmek için bir yol olduğunu okudum. Sebeplerinin ne olduğunu tam olarak hatırlamıyorum ama mantıklı geliyor. Sonuç her iki şekilde de aynıysa, veritabanını şemadan yüklemek, bir sürü taşıma işlemi yapmaktan daha basit ve daha az hataya açık görünüyor.
Jason Swett

3
Muhakeme göçler içindir ki migrate verileri ve giderek Modellerinizin değiştikçe zaman içinde kırılgan hale. Çalıştırmak için mümkün olduğunda çıplak minimum kapsamlandırılmış modellerde geçişlerinize pişirebilirsiniz (ve yapmalısınız), ancak bu sadece iyi ölçeklenmez ve uygulamanın son nokta olduğunu bildiğinden veritabanını oluşturmaktan çok daha az verimlidir . Planın kendisinden sadece şema oluşturabildiğinizde şemanıza benzeyen bir veritabanı oluşturmak için taşıma işlemlerine neden güvenelim?
coreyward

13

Komut satırından çalıştırın

rake db:migrate:reset

bu, uygulamanın tüm taşıma işlemlerini tekrar çalıştırmasını sağlayan tek yoldur. Her göç değişiklikler yapar Çünkü schema.rbve eğer sadece dropve create, migrate(6 raylar üzerinde test) hiçbir şey yapacağız
şampuan

12

Gibi kullanın

rake db:drop db:create db:migrate db:seed

Hepsi tek bir satırda. Ortam tekrar tekrar yüklenmediği için bu daha hızlıdır.

db: drop - veritabanını bırakır.

db: create - veritabanı oluşturur (host / db / password config / database.yml'den alınır)

db: migrate - dizinden var olan taşıma işlemlerini çalıştırır (db / migration / .rb) *.

db: seed - dizinden mümkün olan tohum verilerini çalıştırır (db / migration / seed.rb) ..

Genellikle tercih ederim:

rake db:reset

hepsini bir kerede yapmak.

Şerefe!


1
Ben db: test eklemek istiyorum: iyi önlem almak için buna hazırlayın. Bu, elbette, test edip etmediğinize bağlıdır.
ctc

db:reset == db:drop + db:schema:load + db:seed, db:migrate:reset == db:drop + db:create + db:migrate
x-yuri

11

Sadece adımların sırasını verin: veritabanını bırakın, sonra tekrar oluşturun, verileri taşıyın ve tohumlarınız varsa veritabanını ekin:

rake db:drop db:create db:migrate db:seed

İçin varsayılan ortam yana rakeolan gelişme , eğer Spec testlerde istisna, sizin için db yeniden oluşturmak gerektiğini bakın testi aşağıdaki gibi çevre:

RAILS_ENV=test rake db:drop db:create db:migrate

Çoğu durumda sınama veritabanı sınama yordamları sırasında ekilir, bu nedenle db:seedgörev eyleminin geçirilmesi gerekmez. Aksi takdirde, veritabanını hazırlamanız gerekir:

rake db:test:prepare

veya

RAILS_ENV=test rake db:seed

Ayrıca, yeniden oluşturma görevini için aşağıdaki kodu Rakefile dosyasına ekleyebilirsiniz :

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end

Sonra sorun:

rake db:recreate

8

Manuel olarak şunları yapabilirsiniz:

rake db:drop
rake db:create
rake db:migrate

Ya da sadece rake db:resetyukarıdaki adımları çalıştıracak, ancakdb/seeds.rb dosyanızı .

Ek bir nüans, tüm taşıma dosyalarını tekrar çalıştırmanın aksine rake db:resetdoğrudan schema.rbdosyanızdan yüklenmesidir .

Verileriniz her durumda patlar.


6

Aşağıdaki komut satırını kullanabilirsiniz:

rake db:drop db:create db:migrate db:seed db:test:clone

4

Belirli bir veritabanını bırakmak için bunu raylar konsolunda yapabilirsiniz:

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

Ve sonra DB'yi tekrar taşıyın

$bundle exec rake db:migrate 

4

Raylarda 4.2, tüm verileri kaldırmak ancak veritabanını korumak için

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md


Eh ... Sadece denedim, ama tabloları ve sütunları korumuyor. Bir db: purge çalıştırdıktan sonra bir db: migrate çalıştırmalısınız. Yani bu tabloları ve sütunları korumaz. Ancak veritabanının kendisini korur, böylece db: create
Freddo

1
@Cedric Haklısın, db: tasfiye masayı korumuyor. Kodu güncelledim.
Yana Agun Siswanto

3

Sen kullanabilirsiniz db:reset- run db için: damla ve db: kurulum veya db:migrate:reset - çalışır db: damla, db: oluşturmak ve db: göç ederler.

Kullanmak istediğiniz bağımlı var schema.rb


2

Rails kılavuzuna göre , bu tek astar schema.rb, taşıma dosyalarını tek tek yeniden yüklemek yerine yükleyeceği için kullanılmalıdır :

rake db:reset

1

Geliştirme sırasında her zaman veritabanını yeniden oluşturmak isteyeceğiniz için, lib / görevleri klasörünüzde böyle bir komisyon görevi tanımlayabilirsiniz.

  namespace :db do
      task :all => [:environment, :drop, :create, :migrate] do
   end 
end

ve terminalde koşacaksın

rake db:all

veritabanınızı yeniden oluşturacak


1

Bu komutu çalıştırmak için en iyi yolu düşünüyorum:

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed

1

Sadece koşabilirsin

rake db:setup

Bazı verilerle tohum dosyası oluşturduysanız veritabanını bırakır, yeni veritabanı oluşturur ve tohumdan db'yi doldurur.


1

3 seçenek, aynı sonuç:

1. Tüm adımlar:

  $ rake db:drop           # deletes the database for the current env
  $ rake db:create         # creates the database for the current env
  $ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
  $ rake db:seed           # seed with initial data

2. Sıfırla:

  $ rake db:reset          # drop / schema:load / seed

3. Göç: sıfırlama:

  $ rake db:migrate:reset  # drop / create / migrate
  $ rake db:seed

Notlar:

  • Şema: yük kullanılırsa tüm taşıma işlemlerinden daha hızlıdır, ancak aynı sonuç elde edilir.
  • Tüm veriler kaybolacak.
  • Bir satırda birden fazla tırmık çalıştırabilirsiniz.
  • Raylarla çalışır 3.

0

Bugün raylar şemamda birkaç değişiklik yaptım. Bir hiyerarşide iki modele daha ihtiyacım olduğunu ve bazılarının da silineceğini fark ettim. Modellerde ve kontrol cihazlarında çok az değişiklik yapılması gerekiyordu.

İki yeni modeli ekledim ve bunları kullanarak oluşturdum:

rake db:migrate

Sonra schema.rb dosyasını düzenledim. Artık gerekli olmayan eski modelleri manuel olarak kaldırdım, yabancı anahtar alanını gerektiği gibi değiştirdim ve bana biraz daha açık hale getirmek için biraz yeniden sıraladım. Ben silindi Tüm taşıma ve ardından yoluyla yapı yeniden ran:

rake db:reset

Mükemmel çalıştı. Elbette tüm verilerin yeniden yüklenmesi gerekir. Raylar, taşıma işlemlerinin silindiğini ve yüksek su işaretini sıfırladığını fark etti:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
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.