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.

Nick Hammond
sumber
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
prabu
sumber
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.

Kekuasaan
sumber
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
Lars Schirrmeister
sumber
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

superluminary
sumber
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
aschmid
sumber
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.

Imran Ahmad
sumber
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!

BKSpurgeon
sumber
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 .

Lorem Ipsum Dolor
sumber
11

Anda dapat mencoba yang berikut ini:

remove_column :table_name, :column_name

( Dokumentasi resmi )

Jordan Running
sumber
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.

Eden
sumber
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
Koresol
sumber
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
prash
sumber
5

remove_columndalam changemetode akan membantu Anda menghapus kolom dari tabel.

class RemoveColumn < ActiveRecord::Migration
  def change
    remove_column :table_name, :column_name, :data_type
  end
end

Buka tautan ini untuk referensi lengkap: http://guides.rubyonrails.org/active_record_migrations.html

Dharmesh Rupani
sumber
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

Karan Bamniya
sumber
2

Inilah satu lagi dari konsol rel

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

tenzin dorjee
sumber
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

Manh Cuong
sumber
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

Nuttapon
sumber
1

Cukup, Anda dapat menghapus kolom

remove_column :table_name, :column_name

Sebagai contoh,

remove_column :posts, :comment
Foram Thakral
sumber
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
Taha20
sumber