Bersihkan atau buat kembali basis data Ruby on Rails


582

Saya memiliki dev Ruby on Rails database penuh dengan data. Saya ingin menghapus semuanya dan membangun kembali basis data. Saya sedang berpikir untuk menggunakan sesuatu seperti:

rake db:recreate

Apakah ini mungkin?


Saya sarankan melihat melewati jawaban terunggul tertinggi. Menurut pendapat saya rake db:drop db:create db:schema:loadmungkin lebih tepat daripada rake db:drop db:create db:migrate(meskipun saya siap salah tentang itu).
Jason Swett


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

db:drop + db:create + db:migrate == db:migrate:reset. Saya biasanya menggunakan db:schema:load, ketika migrasi rusak. Saya jarang perlu membuat ulang basis data, jadi kecepatan tidak terlalu menjadi masalah. Juga, jika Anda memiliki migrasi yang belum diterapkan , db:schema:loaddan db:resettidak akan menerapkannya. Tidak yakin apakah itu banyak argumen.
x-yuri

Jawaban:


1074

Saya tahu dua cara untuk melakukan ini:

Ini akan mengatur ulang basis data Anda dan memuat kembali skema Anda saat ini dengan semua:

rake db:reset db:migrate

Ini akan menghancurkan db Anda dan kemudian membuatnya dan kemudian memigrasi skema Anda saat ini:

rake db:drop db:create db:migrate

Semua data akan hilang di kedua skenario.


36
Tampaknya rake db:resetjuga menjalankan semua migrasi (setidaknya di Rails 3), sehingga harus menjadi semua yang diperlukan, bukan?
Plindberg

1
Atau, lebih tepatnya, skema ini identik dengan apa yang menjalankan semua migrasi. Tetapi migrasi tidak berjalan per se (jadi jika Anda memiliki migrasi yang menyisipkan data, itu tidak akan terjadi; untuk ini, Anda harus benar-benar menggunakan file db / seeds.rb).
Plindberg

1
Saya tahu bahwa untuk aplikasi Tracks GTD db: migrasi tidak berfungsi. Saya harus melakukan db: reset ketika pindah dari Sqlite3 ke Postgres.
labirin

11
Anda juga harus menjalankan rake db:test:preparepengujian, atau Anda akan mendapatkan kesalahan seperti:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2

31
Seseorang harus menjelaskan itu rake db:resetdan rake db:drop db:create db:migrate melakukan dua hal yang berbeda . Yang terakhir menghapus seluruh database aplikasi, membuatnya kembali dan kemudian pergi melalui setiap migrasi untuk memperbarui skema ( db/schema.rbatau db/structure.sql), tetapi tidak mengisinya dengan data seed. Alih-alih yang pertama adalah alias untuk rake db:drop db:schema:load db:seed, sehingga menghapus seluruh database aplikasi tetapi tidak memperbarui skema , dan kemudian mengisi dengan data seed. Jadi, jika Anda belum mengubah apa pun dalam migrasi Anda, yang pertama lebih cepat, yang terakhir lebih aman.
Claudio Floreani

157

Pada Rails 4, yang dibutuhkan hanyalah

$ rake db:schema:load

Itu akan menghapus seluruh konten pada DB Anda dan membuat ulang skema dari file schema.rb Anda, tanpa harus menerapkan semua migrasi satu per satu.


6
bekerja untuk rel 3 juga. berguna ketika Anda baru saja mengacaukan basis data pengujian Anda dan ingin meresetnya ke versi kerja yang cocok dengan dev db Anda
bigpotato

Terima kasih untuk ini. Saya tidak menyadarinya db:dropdan db:createberlebihan.
Berikan Birchmeier

3
Ini tidak memperbarui skema, bukan cara yang aman jika Anda merefleksikan migrasi Anda.
Claudio Floreani

ini jawaban terbaik untukku
roxdurazo

2
Migrasi refactoring @ClaudioFloreani meminta masalah. Begitu mereka dijalankan, mereka harus dibiarkan sendiri, secara permanen.
nrowegt

45

Saya menggunakan liner berikut di Terminal.

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

Saya menempatkan ini sebagai shell alias dan menamainya remigrate

Sekarang, Anda dapat dengan mudah "rantai" tugas Rails:

$ 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
Itu akan menjalankan semua migrasi Anda satu demi satu, yang tidak dapat diskalakan dan rawan kesalahan. Juga, saya cukup yakin db: bermigrasi memperbarui schema.rb Anda, jadi skema Anda: dump tidak melakukan sesuatu yang berguna.
coreyward

jadi bagaimana cara mengosongkan basis data? dalam pengembangan ... bersihkan semuanya.
AnApprentice

3
@AnApprentice Anda dapat menjalankan db:reset, yang hanya Google (atau memeriksa Panduan ) jauhnya. Komentar saya bukan untuk menyarankan untuk tidak menggunakan itu, tetapi untuk menghindari menggunakan db:migrateketika apa yang Anda inginkan sebenarnya db:schema:load.
coreyward

7
Omong-omong, @TK, Anda benar-benar tidak perlu menjalankan semua ini sebagai proses terpisah bergantung pada status keluar yang terakhir. Sebaliknya, hanya lulus semua tugas yang diinginkan untuk rake, seperti: rake db:drop db:create db:schema:load.
coreyward

1
Ini anekdotal, tetapi saya belum pernah mengalami masalah yang sedang berjalan db:migrate... padahal db:schema:loadsensitif terhadap seseorang yang lupa memeriksa skema.rb ke dalam kontrol versi bersama migrasi baru.
johncip

37

Pembaruan: Di Rails 5, perintah ini akan dapat diakses melalui perintah ini:

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


Pada rilis terbaru rails 4.2 Anda sekarang dapat menjalankan:

rake db:purge 

Sumber: komit

# 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

Ini dapat digunakan bersama seperti yang disebutkan di atas:

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

Seperti yang dikatakan @bekicot dalam bahasa Inggris yang lebih jelas db:purge"hapus semua data tetapi pertahankan semua tabel dan kolom"
MCB

@ MCB saya salah, sory tentang itu, db:purge tidak menjaga tabel.
Yana Agun Siswanto

29

Tergantung pada apa yang Anda inginkan, Anda dapat menggunakan ...

rake db:create

... untuk membangun basis data dari awal config/database.yml, atau ...

rake db:schema:load

... untuk membangun database dari awal dari schema.rbfile Anda .


1
Anda harus menghapus database terlebih dahulu ... atau Anda bisa menghapus tabel jika mau.
coreyward

5
+1 untuk pemuatan skema. kadang-kadang migrasi menjadi kacau, tetapi skema harus tetap terjaga.
Danny

Saya membaca di The Rails 3 Way bahwa memuat skema adalah cara yang harus dilakukan, bukan menjalankan semua migrasi. Saya tidak ingat persis apa alasan mereka, tetapi tampaknya masuk akal. Jika hasil akhirnya sama saja, tampaknya lebih sederhana dan lebih rentan kesalahan hanya untuk memuat database dari skema daripada menjalankan banyak migrasi.
Jason Swett

3
Alasannya adalah bahwa migrasi dimaksudkan untuk memigrasikan data, dan menjadi semakin rapuh seiring waktu ketika model Anda berubah. Anda dapat (dan harus) memanggang model cakupan minimum ke dalam migrasi Anda kapan pun memungkinkan untuk memastikannya berjalan, tetapi ini tidak berskala baik dan jauh lebih efisien daripada hanya membangun database dari apa yang diketahui aplikasi adalah titik akhir . Mengapa mengandalkan migrasi untuk membuat basis data yang terlihat seperti skema Anda saat Anda dapat membangun dari cetak biru itu sendiri?
coreyward

13

Dari jalankan baris perintah

rake db:migrate:reset

ini adalah satu-satunya cara yang membuat aplikasi untuk menjalankan semua migrasi lagi. Karena setiap migrasi membuat perubahan pada schema.rbdan jika Anda hanya dropdan create, migratetidak akan melakukan apa pun (diuji pada rel 6)
keramas

12

Gunakan seperti

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

Semua dalam satu baris. Ini lebih cepat karena lingkungan tidak dimuat ulang lagi dan lagi.

db: drop - akan menjatuhkan basis data.

db: create - will create database (host / db / password akan diambil dari config / database.yml)

db: migrate - akan menjalankan migrasi yang ada dari direktori (db / migrasi / .rb) *.

db: seed - akan menjalankan data seed yang mungkin dari direktori (db / migrasi / seed.rb) ..

Saya biasanya lebih suka:

rake db:reset

untuk melakukan semuanya sekaligus.

Bersulang!


1
Saya suka menambahkan db: test: bersiaplah untuk ini, untuk ukuran yang baik. Ini tentu saja tergantung pada apakah Anda sedang menguji atau tidak.
ctc

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

11

Cukup keluarkan urutan langkah-langkahnya: jatuhkan basis data, lalu buat kembali itu lagi, migrasikan data, dan jika Anda memiliki benih, taburkan basis data:

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

Karena lingkungan default untuk pengembanganrake adalah , jika Anda melihat pengecualian dalam tes spec, Anda harus membuat ulang db untuk lingkungan pengujian sebagai berikut:

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

Dalam kebanyakan kasus, basis data pengujian ditabur selama prosedur pengujian, sehingga db:seedtindakan tugas tidak perlu dilewatkan. Jika tidak, Anda harus menyiapkan basis data:

rake db:test:prepare

atau

RAILS_ENV=test rake db:seed

Selain itu, untuk menggunakan tugas buat ulang Anda dapat menambahkan ke dalam Rakefile kode berikut:

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

Lalu terbitkan:

rake db:recreate

8

Anda dapat melakukannya secara manual:

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

Atau adil rake db:reset, yang akan menjalankan langkah-langkah di atas tetapi juga akan menjalankan db/seeds.rbfile Anda .

Nuansa yang ditambahkan adalah bahwa rake db:resetmemuat langsung dari schema.rbfile Anda sebagai lawan menjalankan semua file migrasi lagi.

Data Anda akan terpesona dalam semua kasus.


6

Anda dapat menggunakan baris perintah berikut:

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

4

Untuk menjatuhkan basis data tertentu, Anda dapat melakukan ini di konsol rel:

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

Dan kemudian migrasi DB lagi

$bundle exec rake db:migrate 

4

Pada rel 4.2, untuk menghapus semua data tetapi mempertahankan database

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

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


Yah ... Baru mencobanya, tetapi tidak mempertahankan tabel dan kolom. Anda harus menjalankan db: bermigrasi setelah menjalankan db: purge. Jadi ini tidak menyimpan tabel dan kolom. Namun itu mempertahankan database itu sendiri sehingga Anda tidak perlu db: create
Freddo

1
@Cedric Anda benar, db: purge tidak menyimpan tabel. Saya memperbarui kode.
Yana Agun Siswanto

3

Anda dapat menggunakan db:reset- untuk menjalankan db: drop dan db: setup atau db:migrate:reset- yang menjalankan db: drop, db: create dan db: migrate.

tergantung pada Anda ingin menggunakan schema.rb ada


2

Menurut panduan Rails , liner satu ini harus digunakan karena akan memuat dari schema.rbalih - alih memuat ulang file migrasi satu per satu:

rake db:reset

1

Karena dalam pengembangan, Anda selalu ingin membuat ulang basis data, Anda dapat menentukan tugas rake di folder lib / tugas Anda seperti itu.

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

dan di terminal Anda akan lari

rake db:all

itu akan membangun kembali basis data Anda


1

Saya pikir cara terbaik untuk menjalankan perintah ini:

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

1

Cukup Anda bisa lari

rake db:setup

Ini akan menjatuhkan basis data, membuat basis data baru dan mengisi db dari seed jika Anda membuat file seed dengan beberapa data.


1

3 opsi, hasil yang sama:

1. Semua langkah:

  $ 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. Reset:

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

3. Bermigrasi: reset:

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

Catatan:

  • Jika skema: beban digunakan lebih cepat daripada melakukan semua migrasi, tetapi hasilnya sama.
  • Semua data akan hilang.
  • Anda dapat menjalankan banyak garu dalam satu baris.
  • Bekerja dengan rel 3.

0

Saya hari ini telah membuat beberapa perubahan pada skema rel saya. Saya menyadari bahwa saya membutuhkan dua model tambahan dalam hierarki dan beberapa lainnya harus dihapus. Ada banyak perubahan kecil yang diperlukan untuk model dan pengontrol.

Saya menambahkan dua model baru dan membuatnya, menggunakan:

rake db:migrate

Kemudian saya mengedit file schema.rb. Saya secara manual menghapus model lama yang tidak lagi diperlukan, mengubah bidang kunci asing seperti yang diperlukan dan hanya memesannya kembali sedikit agar lebih jelas bagi saya. Saya menghapus semua migrasi, dan menjalankan ulang build melalui:

rake db:reset

Itu bekerja dengan sempurna. Semua data harus dimuat ulang, tentu saja. Rails menyadari bahwa migrasi telah dihapus dan mengatur ulang tanda air tinggi:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.