Tampilkan migrasi yang tertunda di rel

162

Apakah ada tugas menyapu yang menunjukkan migrasi yang tertunda di aplikasi rel?

Hanya baca
sumber

Jawaban:

258

rake db:migrate:status(Rel 3 sampai 5) atau rails db:migrate:status(Rails 5) akan mencapai ini. Lihat komit ini .

upberarti migrasi telah dijalankan. downberarti migrasi belum berjalan.

jrdioko
sumber
Saya mendapatkan Don't know how to build task 'db:migrate:status'rel 3.2.8
Peter Ehrlich
1
@PeterEhrlich: Apakah itu tidak muncul rake -Ttetapi yang lain melakukannya?
jrdioko
2
bundle exec rake db: migrate: status
Nadeem Yasin
2
Bagaimana Anda membaca output dari perintah ini? Jika status baris "turun", apakah itu berarti migrasi yang tertunda?
Dennis
12
upberarti migrasi telah dijalankan. downberarti migrasi belum berjalan.
Josh
37

Ada rake db:abort_if_pending_migrations(setidaknya di Rails 2.3.3, tidak yakin kapan diperkenalkan). Deskripsi mengatakan 'Meningkatkan kesalahan jika ada migrasi yang tertunda'. Ini tampaknya lebih digunakan sebagai prasyarat untuk tugas-tugas lain, tapi saya kira Anda bisa menggunakannya untuk tujuan Anda.

EDIT: Berikut adalah contoh dari output setelah baru saja dibuat dan tidak menjalankan migrasi 'test'

rails_project theIV$ rake db:abort_if_pending_migrations
(in /Users/theIV/Sites/rails_project/)
You have 1 pending migrations:
  20090828200602 Test
Run "rake db:migrate" to update your database then try again.
theIV
sumber
Saya suka menambahkan ini untuk mengatur ketergantungan antara wadah rel
Vincent De Smet
Masih ada di Rails 4.1.16
Magne
Bekerja di rel 5.1.3 juga
Wilson Silva
16

Perintah ini akan mencantumkan semua migrasi dengan statusnya ( UPatau DOWN)

Rel 3 dan 4

rake db:migrate:status

Rel 5

rake db:migrate:status

# Or

rails db:migrate:status
Deepak Mahakale
sumber
15

rake db:version akan mencapai ini di Rails 2.

tukang kebun
sumber
Juga berlaku di rel 3.2.18
Ian Vaughan
6

Ini berfungsi untuk rel 5.2

ActiveRecord::Base.connection.migration_context.needs_migration?
Sairam
sumber
2

Coba rake -h (bantuan) dan lihatlah rake -n (= rake --dry-run). Jadi mungkin sesuatu seperti rake -n db: migrasi harus memberikan apa yang Anda inginkan.

John Lockwood
sumber
2
Itu tidak akan berhasil. Itu hanya mencetak: ** Panggil db: bermigrasi (first_time) ** Panggil lingkungan (first_time) ** Jalankan lingkungan (jalankan kering) ** Jalankan (dry run) db: bermigrasi
jrdioko
2

Mungkin bukan apa yang diminta OP, tetapi jika Anda hanya perlu dengan cepat memeriksa apakah ada migrasi yang menunggu untuk digunakan dalam tugas menyapu, tanpa menggunakan

rake db: migrasi: status | grep down (mungkin tidak berfungsi jika Anda menggunakan Windows)

ActiveRecord :: Migration.check_pending! (memunculkan ActiveRecord :: PendingMigrationError yang perlu Anda selamatkan)

Anda dapat menggunakan needs_migration? metode: https://apidock.com/rails/v4.0.2/ActiveRecord/Migrator/needs_migration%3F/class

wondersz1
sumber
2
ActiveRecord::Migrator.needs_migration?dalam Rails 5.1
niborg
1

Perintah berikut untuk memeriksa status migrasi:

rake db:migrate:status

ATAU

ketika Anda menjalankan server Anda, itu akan menampilkan pesan untuk menjalankan migrasi Anda yang tertunda terlebih dahulu.

puneet18
sumber
1

Jika Anda ingin melihat berapa banyak migrasi yang dilakukan atau menunggu, Anda dapat melihat menggunakan perintah di bawah ini.

rails db:migrate:status

Lebih lanjut tentang tautan ini: Rails Active Record Migration

Foram Thakral
sumber
1

Jika Anda memerlukan bash one-liner untuk menentukan apakah akan menjalankan migrasi atau tidak (mis., Hanya bermigrasi dalam perintah fase rilis Heroku ketika ada migrasi yang tertunda), ini berfungsi:

(rails db:migrate:status | grep "^\s*down") && rails db:migrate || echo "No pending migrations found."
niborg
sumber