Perbedaan antara rake db: migrasi db: reset dan db: schema: load

619

Perbedaan antara rake db:migratedan rake db:resetcukup jelas di kepala saya. Hal yang saya tidak mengerti adalah betapa rake db:schema:loadberbedanya dengan yang sebelumnya.

Hanya untuk memastikan bahwa saya berada di halaman yang sama:

  • rake db:migrate - Menjalankan migrasi yang belum dijalankan.
  • rake db:reset- Menghapus database (mungkin rake db:drop+ rake db:create+ rake db:migrate) dan menjalankan migrasi pada database baru.

Tolong bantu untuk menjelaskan, jika pemahaman saya salah.

Gaurav Agarwal
sumber
10
Apakah rake --tasksmembantu?
zx1986
Anda harus memeriksa blog ini. jacopretorius.net/2014/02/…
Bishisht Bhatta
Pemahaman Anda tentang rake db:migrateitu benar, tetapi pemahaman Anda tentang rake db:resetitu salah. Lihat jawaban teratas, dari moritz.
Magne
1
BTW, sebagai Rails 5, perintah ini dapat dipanggil sebagai rails db:migrate, rails db:reset, rails db:schema:load. Lihat stackoverflow.com/questions/38403533/…
Purplejacket

Jawaban:

1303
  • db: melakukan migrasi menjalankan (tunggal) migrasi yang belum berjalan.
  • db: create menciptakan database
  • db: drop menghapus database
  • db: schema: load menciptakan tabel dan kolom di dalam database (sudah ada) berikut schema.rb

  • db: setup tidak db: create, db: schema: load, db: seed

  • db: reset tidak db: drop, db: setup
  • db: bermigrasi: reset tidak db: drop, db: create, db: bermigrasi

Biasanya, Anda akan menggunakan db: migrasi setelah membuat perubahan pada skema melalui file migrasi baru (ini masuk akal hanya jika sudah ada data dalam database). db: schema: load digunakan saat Anda menyiapkan instance baru aplikasi Anda.

Saya harap itu membantu.


PEMBARUAN untuk rel 3.2.12:

Saya baru saja memeriksa sumbernya dan dependensinya seperti ini sekarang:

  • db: create menciptakan database untuk env saat ini
  • db: create: all menciptakan database untuk semua envs
  • db: drop drop database untuk env saat ini
  • db: drop: all drop database untuk semua envs
  • db: migrasi menjalankan migrasi untuk env saat ini yang belum berjalan
  • db: migrasi: menjalankan satu migrasi spesifik
  • db: migrasi: turunkan kembali satu migrasi tertentu
  • db: migrate: status menunjukkan status migrasi saat ini
  • db: rollback mengembalikan migrasi terakhir
  • db: maju memajukan versi skema saat ini ke yang berikutnya
  • db: seed (only) menjalankan file db / seed.rb
  • db: schema: memuat memuat skema ke dalam basis data env saat ini
  • db: schema: dump membuang skema env saat ini (dan tampaknya juga membuat db)

  • db: setup berjalan db: skema: load, db: seed

  • db: reset menjalankan db: drop db: setup
  • db: bermigrasi: mengulang berjalan (db: bermigrasi: turun db: bermigrasi: atas) atau (db: kembalikan db: bermigrasi) tergantung pada migrasi yang ditentukan
  • db: bermigrasi: reset menjalankan db: drop db: create db: migrate

Untuk informasi lebih lanjut silakan lihat di https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake (untuk Rails 3.2.x) dan https: // github .com / rails / rails / blob / v4.0.5 / activerecord / lib / active_record / railties / databases.rake (untuk Rails 4.0.x)

moritz
sumber
16
Inilah file dengan jawaban :) - github.com/rails/rails/blob/master/activerecord/lib/…
cutalion
3
@pemotongan: db: setup pasti tidak menjalankan db: bermigrasi, karena akan jauh terlalu rapuh untuk menjalankan semua migrasi hanya untuk pengaturan db (inilah gunanya schema.rb untuk).
moritz
2
Saya mengeksekusi db: reset dan seeding db saya. Kenapa bisa begitu?
Alejandro Riedel
db: setup juga berjalan db:createjika perlu. Setidaknya pada rel 4.0.2.
Dan
Rails 4 akan melakukan rake db:migrateketika memanggil rake db:setupjika ada migrasi yang tertunda tetapi tidak akan melakukan migrasi yang tertunda.
Pooyan Khosravi
24

TLDR

Menggunakan

  • rake db:migrate Jika Anda ingin membuat perubahan pada skema
  • rake db:reset Jika Anda ingin menghapus database, muat ulang skema dari schema.rb , dan masukkan kembali basis data
  • rake db:schema:loadJika Anda ingin mengatur ulang basis data ke skema sebagaimana diatur dalam schema.rb(Ini akan menghapus semua data)

Penjelasan

rake db:schema:loadakan mengatur skema seperti yang disediakan dalam schema.rbfile. Ini berguna untuk pemasangan aplikasi baru karena tidak memerlukan banyak waktudb:migrate

Catatan penting, db:schema:loadakan menghapus data di server.

rake db:migratemembuat perubahan pada skema yang ada. Ini seperti membuat versi skema. db:migrateakan mencari db/migrate/file ruby ​​dan melakukan migrasi yang belum berjalan dimulai dengan yang tertua. Rails tahu file mana yang tertua dengan melihat stempel waktu di awal nama file migrasi. db:migratehadir dengan manfaat bahwa data juga dapat dimasukkan ke dalam basis data. Ini sebenarnya bukan praktik yang baik. Lebih baik digunakan rake db:seeduntuk menambahkan data.

rake db:migratemenyediakan tugas naik , turun dll yang memungkinkan perintah suka rake db:rollbackdan menjadikannya perintah yang paling berguna.

rake db:resetmelakukan a db:dropdan db:setup
menjatuhkan database, membuatnya lagi, memuat skema, dan menginisialisasi dengan data seed

Bagian yang relevan dari perintah dari databases.rake


namespace :schema do
  desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
  task :dump => [:environment, :load_config] do
    require 'active_record/schema_dumper'
    filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
    File.open(filename, "w:utf-8") do |file|
      ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
    end
    db_namespace['schema:dump'].reenable
  end

  desc 'Loads a schema.rb file into the database'
  task :load => [:environment, :load_config, :check_protected_environments] do
    ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
  end

  # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
  task :reset => [ 'db:drop', 'db:setup' ]

namespace :migrate do
  # desc  'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
  task :redo => [:environment, :load_config] do
    if ENV['VERSION']
      db_namespace['migrate:down'].invoke
      db_namespace['migrate:up'].invoke
    else
      db_namespace['rollback'].invoke
      db_namespace['migrate'].invoke
    end
  end
sudo bangbang
sumber
Jadi, jika Anda membuat skema produksi menggunakan db: schema: load (dibuat dari serangkaian migrasi sebelumnya), akan menyapu tahu migrasi mana (yang mengambil bagian dalam pembuatan skema awal.rb) tidak perlu dijalankan di masa mendatang doa db: bermigrasi?
CanadaIT
2

Sejauh yang saya mengerti, itu akan menjatuhkan database Anda dan membuatnya kembali berdasarkan db/schema.rbfile Anda . Itu sebabnya Anda perlu memastikan bahwa schema.rbfile Anda selalu up to date dan di bawah kontrol versi.

Simon Bagreev
sumber
0

Anda bisa melihat dalam tugas Rekam Aktif Rake karena di situlah saya percaya mereka hidup seperti dalam file ini. https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

Apa yang mereka lakukan adalah pertanyaan Anda, kan?

Itu tergantung dari mana mereka berasal dan ini adil dan contoh untuk menunjukkan bahwa mereka berbeda tergantung pada tugas. Di sini kita memiliki file berbeda yang penuh dengan tugas.

https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile

yang memiliki tugas-tugas ini.

namespace :db do
  task create: ["db:mysql:build", "db:postgresql:build"]
  task drop: ["db:mysql:drop", "db:postgresql:drop"]
end

Ini mungkin tidak menjawab pertanyaan Anda tetapi bisa memberi Anda wawasan untuk melanjutkan dan mencari sumbernya terutama file rake dan tugas. Karena mereka melakukan pekerjaan yang cukup baik dalam membantu Anda menggunakan rel, mereka tidak selalu mendokumentasikan kode dengan baik. Kita semua dapat membantu di sana jika kita tahu apa yang seharusnya dilakukan.

Douglas G. Allen
sumber
Silakan kutip bagian yang relevan dari artikel jika itu dihapus. Jangan menyarankan melakukan sesuatu tanpa menjelaskan alasannya.
PhilT
0

DIPERBARUI untuk Rails 5:

db:create- Membuat database untuk lingkungan RAILS_ENV saat ini . Jika RAILS_ENV tidak ditentukan, standarnya adalah pengembangan dan pengujian basis data.

db:create:all - Membuat database untuk semua lingkungan.

db:drop- Drops database untuk lingkungan RAILS_ENV saat ini . Jika RAILS_ENV tidak ditentukan, standarnya adalah pengembangan dan pengujian basis data.

db:drop:all - Menjatuhkan basis data untuk semua lingkungan.

db:migrate- Menjalankan migrasi untuk lingkungan saat ini yang belum berjalan. Secara default itu akan menjalankan migrasi hanya di lingkungan pengembangan.

db:migrate:redo- Menjalankan db: bermigrasi: turun dan db: bermigrasi: naik atau db: bermigrasi: rollback dan db: bermigrasi: naik tergantung pada migrasi yang ditentukan.

db:migrate:up - Menjalankan VERSI migrasi yang diberikan.

db:migrate:down - Menjalankan turun untuk VERSI migrasi yang diberikan.

db:migrate:status - Menampilkan status migrasi saat ini.

db:migrate:rollback - Putar kembali migrasi terakhir.

db:version - Mencetak versi skema saat ini.

db:forward - Mendorong skema ke versi berikutnya.

db:seed- Menjalankan file db / seeds.rb .

db:schema:loadMenciptakan basis data dari file schema.rb .

db:schema:dumpMembuang skema lingkungan saat ini ke db / schema.rb .

db:structure:load- Menciptakan basis data dari file structure.sql .

db:structure:dump- Membuang skema lingkungan saat ini ke db / structure.sql . (Anda dapat menentukan file lain dengan SCHEMA=db/my_structure.sql)

db:setupMenjalankan db: buat , db: skema: memuat dan db: seed .

db:resetMenjalankan db: drop dan db: setup . db:migrate:reset- Menjalankan db: drop , db: create dan db: migrate .

db:test:prepare- Periksa migrasi yang tertunda dan muat skema pengujian. (Jika Anda menjalankan rake tanpa argumen apa pun, itu akan melakukan ini secara default.)

db:test:clone - Menciptakan basis data uji dari skema basis data lingkungan saat ini.

db:test:clone_structure- Mirip dengan db: test: clone , tetapi itu akan memastikan bahwa database pengujian Anda memiliki struktur yang sama, termasuk rangkaian karakter dan kumpulan, sebagai basis data lingkungan Anda saat ini.

db:environment:set- Atur lingkungan RAILS_ENV saat ini di ar_internal_metadata tabel . (Digunakan sebagai bagian dari pemeriksaan lingkungan yang dilindungi.)

db:check_protected_environments- Memeriksa apakah tindakan destruktif dapat dilakukan di lingkungan RAILS_ENV saat ini . Digunakan secara internal ketika menjalankan tindakan destruktif seperti db: drop atau db: schema: load .

Ваня Скоцик
sumber