Cara menjatuhkan kolom menggunakan migrasi Rails


Jawaban:


917
remove_column :table_name, :column_name

Contohnya:

remove_column :users, :hobby

akan menghapus Kolom hobi dari tabel pengguna.


9
Dan pastikan untuk melakukan ini di dalam updan downmetode, tidak change, seperti yang dijelaskan dalam jawaban oleh @Power.
XåpplI'-I0llwlg'I -

7
@ XåpplI'-I0llwlg'I-Terima kasih atas komentarnya. Metode perubahan dapat digunakan untuk menjatuhkan kolom di aplikasi Rails 4, tetapi tidak boleh digunakan dalam Rails 3. Saya memperbarui jawaban saya sesuai.
Powers

9
Anda juga dapat menggunakan remove_column :table_name, :column_name, :type, :optionsdalam changemetode ini, karena jika Anda menentukan jenis pengembalian migrasi mungkin. Dari dokumentasi: The typedan optionsparameter akan diabaikan jika ada. Sangat membantu untuk menyediakan ini dalam metode migrasi changesehingga dapat dikembalikan. Dalam hal ini, typedan optionsakan digunakan oleh add_column.
Nicolas

24
Di Rails4, Anda bisa menghapus kolom dalam changemetode ini, tetapi hanya jika Anda menentukan jenis kolom. Misalnya remove_column, :table_name, :column_name, :column_type. Kalau tidak, Anda akan mendapatkan kesalahan berikut ketika mencoba menjalankan migrasi:remove_column is only reversible if given a type
Dennis

5
Mungkin perlu diperhatikan dalam jawaban utama bahwa menghapus kolom tidak menghapus indeks yang sesuai jika ada
sama dengan

371

Untuk versi Rails yang lebih lama

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Untuk Rails 3 ke atas

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
"rails g" dapat digunakan sebagai alternatif dari "rails generate"
Noz

44
rails g migration remove_field_name_from_table_name field_name:datatypejuga bekerja
Stuart Nelson

6
Perhatikan juga bahwa AddXXXtoTTTsebuah RemoveXXXFromTTTdapat diikuti dengan daftar putih spasi dari filed_name: data_type, dan sesuai pernyataan add_column dan remove_column akan dibuat: rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integermenghilangkan dua atribut menggunakan migrasi tunggal. Perhatikan juga bahwa remove_columntidak didukung oleh changemetode, jadi Anda harus menulis keduanya updan down.
Claudio Floreani

3
Rails 4 tampaknya mendukung changehal ini. Rollback berfungsi seperti seharusnya.
Unknown_Guy

2
@ AdamGrant Saya pikir jika Anda menggunakan changemetode yang dapat dikembalikan * Anda harus menginformasikan tipe data (dan semua pengubah bidang lainnya), jadi jika Anda mengembalikan migrasi itu, bidang dapat dibuat kembali dengan benar. * Ketika saya katakan dikembalikan, itu dalam hal struktur database, tentu saja, data dari kolom itu jelas akan hilang.
RFVoltolini

117

Rails 4 telah diperbarui, sehingga metode perubahan dapat digunakan dalam migrasi untuk menjatuhkan kolom dan migrasi akan berhasil dikembalikan. Silakan baca peringatan berikut untuk aplikasi Rails 3:

Rails 3 Peringatan

Harap dicatat bahwa ketika Anda menggunakan perintah ini:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

Migrasi yang dihasilkan akan terlihat seperti ini:

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

Pastikan untuk tidak menggunakan metode perubahan saat menghapus kolom dari tabel database (contoh apa yang tidak Anda inginkan dalam file migrasi di aplikasi Rails 3):

  def change
    remove_column :table_name, :field_name
  end

Metode perubahan di Rails 3 tidak cerdas ketika datang ke remove_column, jadi Anda tidak akan dapat mengembalikan migrasi ini.


3
kemudian jalankan rake db: migrate
roxdurazo

1
@Power - jawaban yang cemerlang dan jelas - apakah Anda dapat menguraikan hal-hal berikut: "Metode perubahan di Rails 3 tidak cerdas ketika menyangkut untuk menghapus_kolom, sehingga Anda tidak akan dapat mengembalikan migrasi ini."
BKSpurgeon

1
@ BKSpurgeon - Di Rails 3, jika Anda menggunakan changemetode ini, maka rake db:rollbackperintah itu akan keluar. rake db:rollbackpada dasarnya kebalikan dari rake db:migrate. Bug ini diperbaiki di Rails 4 :)
Powers

2
Di Rails 4, saya mencoba untuk mengembalikan kolom drop drop. Gagal dan menyatakan Anda harus menentukan data_type (seperti dalam kode turun Anda dalam jawaban Anda)
rmcsharry

1
Masalah yang sama terjadi pada saya dengan @rmcsharry. Versi rel saya adalah 4.2.2 dan saya menggunakan metode perubahan. ketika saya mencoba untuk mengembalikan, terjadi kesalahan bahwa remove_column hanya dapat dibalik jika diberikan tipe.
M. Habib

38

Dalam aplikasi rails4 dimungkinkan untuk menggunakan metode perubahan juga untuk menghapus kolom. Param ketiga adalah tipe data_type dan dalam opsional sebagainya Anda dapat memberikan opsi. Agak tersembunyi di bagian 'Transformasi yang tersedia' pada dokumentasi .

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

27

Ada dua cara yang baik untuk melakukan ini:

hapus_kolom

Anda cukup menggunakan remove_column, seperti:

remove_column :users, :first_name

Ini bagus jika Anda hanya perlu melakukan satu perubahan pada skema Anda.

blok change_table

Anda juga dapat melakukan ini menggunakan blok change_table, seperti:

change_table :users do |t|
  t.remove :first_name
end

Saya lebih suka ini karena saya merasa lebih terbaca, dan Anda dapat membuat beberapa perubahan sekaligus.

Inilah daftar lengkap metode change_table yang didukung:

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


15

di rails 5 Anda dapat menggunakan perintah ini di terminal:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

misalnya untuk menghapus kolom access_level (string) dari pengguna tabel:

rails generate migration remove_access_level_from_users access_level:string

lalu jalankan:

rake db:migrate

14

Hasilkan migrasi untuk menghapus kolom sehingga jika dimigrasikan ( rake db:migrate), harus drop kolom . Dan itu harus menambahkan kolom kembali jika migrasi ini dibatalkan ( rake db:rollback).

Sintaksnya:

remove_column: table_name,: column_name,: type

Menghapus kolom, juga menambahkan kolom kembali jika migrasi dibatalkan.

Contoh:

remove_column :users, :last_name, :string

Catatan : Jika Anda melewatkan data_type , migrasi akan menghapus kolom dengan sukses tetapi jika Anda mengembalikan migrasi itu akan menimbulkan kesalahan.


13

Instruksi Clear & Simple untuk Rails 5.2

  • PERINGATAN: Anda akan kehilangan data jika Anda menghapus kolom dari database Anda . Untuk melanjutkan, lihat di bawah:
  • Peringatan: petunjuk di bawah ini untuk migrasi sepele . Untuk migrasi kompleks dengan mis. Jutaan dan jutaan baris, Anda harus memperhitungkan kemungkinan kegagalan, Anda juga harus memikirkan cara mengoptimalkan migrasi Anda agar migrasi berjalan dengan cepat, dan kemungkinan bahwa pengguna akan menggunakan aplikasi Anda sementara proses migrasi sedang terjadi. Jika Anda memiliki banyak basis data, atau jika ada sesuatu yang agak rumit, maka jangan salahkan saya jika ada yang salah!

1. Buat migrasi

Jalankan perintah berikut di terminal Anda:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Catatan: nama tabel harus dalam bentuk jamak sesuai konvensi rel.

Contoh:

Dalam kasus saya, saya ingin menghapus acceptedkolom (nilai boolean) dari quotestabel:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

Lihat kembali dokumentasi : konvensi saat menambahkan / menghapus bidang ke tabel:

Ada pintasan sintaksis khusus untuk menghasilkan migrasi yang menambahkan bidang ke tabel.

rails menghasilkan migrasi add_fieldname_to_tablename fieldname: fieldtype

2. Periksa migrasi

# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
  # with rails 5.2 you don't need to add a separate "up" and "down" method.
  def change
    remove_column :quotes, :accepted, :boolean
  end
end

3. Jalankan migrasi

rake db:migrate

.... Dan kemudian Anda pergi ke balapan!


sekarang migrasi juga dapat dijalankan sebagairails db:migrate
Imran Ali

12

Hapus Kolom Untuk Aplikasi RAILS 5

rails g migration Remove<Anything>From<TableName> [columnName:type]

Perintah di atas menghasilkan file migrasi di dalam db/migratedirektori. Cuplikan potongan adalah salah satu kolom hapus dari tabel contoh yang dihasilkan oleh generator Rails,

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

Saya juga membuat panduan referensi cepat untuk Rails yang dapat ditemukan di sini .



10
rails g migration RemoveXColumnFromY column_name:data_type

X = nama kolom
Y = nama tabel

EDIT

Berubah RemoveXColumnToYuntuk RemoveXColumnFromYper komentar - menyediakan kejelasan lebih lanjut untuk apa yang benar-benar melakukan migrasi.


3
"Hapus kolom untuk tabel" terdengar aneh, jadi dari tampaknya menjadi pilihan yang lebih baik di sini.
Sebastian vom Meer

@SebastianvomMeer ya saya setuju - bahasa Inggris berbunyi jauh lebih baik dengan 'from'
BKSpurgeon

8

Untuk menghapus kolom dari tabel Anda harus menjalankan migrasi berikut:

rails g migration remove_column_name_from_table_name column_name:data_type

Kemudian jalankan perintah:

rake db:migrate

5

Berikan perintah di bawah ini yang akan ditambahkan dalam file migrasi sendiri

rails g migration RemoveColumnFromModel

Setelah menjalankan perintah di atas, Anda dapat memeriksa file migrasi kode remove_column harus ditambahkan di sana sendiri

Kemudian migrasi db

rake db:migrate


5

Untuk menghapus kolom dari tabel hanya dengan 3 langkah mudah sebagai berikut:

  1. tulis perintah ini

rails g migration remove_column_from_table_name

setelah menjalankan perintah ini di terminal satu file yang dibuat dengan nama dan cap waktu ini (remove_column from_table_name).

Lalu buka file ini.

  1. di dalam file Anda harus menulis

    remove_column :table_name, :column_name

  2. Akhirnya pergi ke konsol dan kemudian lakukan

    rake db:migrate


2

Inilah satu lagi dari konsol rel

ActiveRecord::Migration.remove_column(:table_name, :column_name)


1

Melalui
remove_column :table_name, :column_name
dalam file migrasi

Anda dapat menghapus kolom secara langsung di konsol rel dengan mengetik:
ActiveRecord::Base.remove_column :table_name, :column_name


1

Lakukan seperti ini;

rails g migration RemoveColumnNameFromTables column_name:type

Yaitu rails g migration RemoveTitleFromPosts title:string

Bagaimanapun, Akan lebih baik untuk mempertimbangkan tentang downtime juga karena ActiveRecord cache kolom basis data saat runtime jadi jika Anda menjatuhkan kolom, itu dapat menyebabkan pengecualian sampai aplikasi Anda reboot.

Ref: Migrasi yang kuat


1

Cukup, Anda dapat menghapus kolom

remove_column :table_name, :column_name

Sebagai contoh,

remove_column :posts, :comment

1

pertama-tama cobalah membuat file migrasi yang menjalankan perintah:

rails g migration RemoveAgeFromUsers age:string

dan kemudian pada direktori root proyek jalankan migrasi menjalankan perintah:

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