Tampilkan migrasi yang tertunda di rel


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.


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.

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


6

Ini berfungsi untuk rel 5.2

ActiveRecord::Base.connection.migration_context.needs_migration?

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.


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


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.



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."
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.