Pertanyaan Bagaimana saya bisa mengganti nama kolom database dalam migrasi Ruby on Rails?


Saya salah menamai kolom hased_password dari pada hashed_password.

Bagaimana cara memperbarui skema basis data, menggunakan migrasi untuk mengganti nama kolom ini?


1280
2018-01-02 16:18


asal


Jawaban:


rename_column :table, :old_column, :new_column

Memperbarui:

Anda mungkin ingin membuat migrasi terpisah untuk melakukan ini. (Ganti Nama FixColumnName seperti yang Anda mau)

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

Kemudian edit migrasi untuk melakukan kehendak Anda.

# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
  def self.up
    rename_column :table_name, :old_column, :new_column
  end

  def self.down
    # rename back if you need or do something else or do nothing
  end
end

Pembaruan untuk Rails 3.1

Selagi up dan down metode masih berlaku. Rails 3.1 menerima sebuah change metode itu "tahu cara memigrasikan database Anda dan membalikkannya ketika migrasi digulirkan kembali tanpa perlu menulis metode terpisah"

rails g migration FixColumnName

class FixColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

Jika Anda kebetulan memiliki sejumlah besar kolom untuk mengganti nama, atau sesuatu yang diperlukan untuk mengulangi nama tabel berulang kali.

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

Anda bisa menggunakannya change_table untuk menjaga agar sedikit lebih rapi.

class FixColumnNames < ActiveRecord::Migration
  def change
    change_table :table_name do |t|
      t.rename :old_column1, :new_column1
      t.rename :old_column2, :new_column2
      ...
    end
  end
end

Terima kasih, Luke && Turadg, untuk mengangkat topik.

Lalu, adil db:migrate seperti biasa atau bagaimana pun Anda menjalankan bisnis Anda.


Pembaruan untuk Rails 4

Saat membuat a Migration untuk mengganti nama kolom, Rails 4 menghasilkan a change metode bukan up dan down sebagaimana disebutkan dalam jawaban di atas. Yang dihasilkan change metode adalah sebagai berikut:

$ > rails g migration ChangeColumnName

yang akan membuat file migrasi yang mirip dengan ini:

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

2081
2018-01-02 16:31



IMO, dalam hal ini, lebih baik digunakan rake db:rollback. Kemudian edit migrasi Anda dan ketik lagi rake db:migrate. Namun, jika Anda memiliki data di kolom yang tidak ingin Anda hilangkan, gunakan rename_column.


65
2018-01-03 00:55



http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

Dibawah Available Transformations

rename_column(table_name, column_name, new_column_name):

Mengganti nama kolom tetapi menyimpan tipe dan konten.


26
2018-01-02 16:26



Jika kolom sudah diisi dengan data dan hidup dalam produksi, saya akan merekomendasikan pendekatan langkah demi langkah, sehingga untuk menghindari downtime dalam produksi sambil menunggu migrasi.

Pertama saya akan membuat migrasi db untuk menambahkan kolom dengan nama baru (s) dan mengisi mereka dengan nilai dari nama kolom lama.

class AddCorrectColumnNames < ActiveRecord::Migration
  def up
    add_column :table, :correct_name_column_one, :string
    add_column :table, :correct_name_column_two, :string

    puts 'Updating correctly named columns'
    execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
    end
  end

  def down
    remove_column :table, :correct_name_column_one
    remove_column :table, :correct_name_column_two
  end
end

Kemudian saya akan melakukan perubahan itu, dan mendorong perubahan ke dalam produksi.

git commit -m 'adding columns with correct name'

Kemudian setelah komit didorong ke dalam produksi, saya akan lari.

Production $ bundle exec rake db:migrate

Lalu saya akan memperbarui semua tampilan / pengontrol yang merujuk nama kolom lama ke nama kolom baru. Jalankan melalui test suite saya, dan lakukan hanya perubahan itu. (Setelah memastikan itu bekerja secara lokal dan melewati semua tes terlebih dahulu!)

git commit -m 'using correct column name instead of old stinky bad column name'

Kemudian saya mendorong komitmen itu untuk produksi.

Pada titik ini Anda dapat menghapus kolom asli tanpa khawatir tentang downtime apa pun yang terkait dengan migrasi itu sendiri.

class RemoveBadColumnNames < ActiveRecord::Migration
  def up
    remove_column :table, :old_name_column_one
    remove_column :table, :old_name_column_two
  end

  def down
    add_column :table, :old_name_column_one, :string
    add_column :table, :old_name_column_two, :string
  end
end

Lalu dorong migrasi terbaru ini ke produksi dan jalankan bundle exec rake db:migrate di latar belakang.

Saya menyadari ini sedikit lebih terlibat dalam suatu proses, tetapi saya lebih suka melakukan ini daripada memiliki masalah dengan migrasi produksi saya.


24
2017-08-30 22:08



Jalankan perintah di bawah untuk membuat file migrasi:

rails g migration ChangeHasedPasswordToHashedPassword

Kemudian di file yang dihasilkan di db/migrate folder, tulis rename_column seperti di bawah ini:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end

16
2017-12-03 11:45



Dari API:

rename_column(table_name, column_name, new_column_name)

Ini mengganti nama kolom tetapi membuat jenis dan konten tetap sama.


13
2018-02-18 11:15



Beberapa versi Ruby on Rails mendukung metode naik / turun untuk migrasi dan jika Anda memiliki metode naik / turun dalam migrasi Anda, maka:

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

Jika Anda punya change metode dalam migrasi Anda, maka:

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

Untuk informasi lebih lanjut Anda dapat memindahkan: Ruby on Rails - Migrasi atau Migrasi Rekaman Aktif.


12
2018-02-14 10:38



Jika kode Anda tidak dibagikan dengan yang lain, maka pilihan terbaik adalah melakukannya rake db:rollback kemudian edit nama kolom Anda dalam migrasi dan rake db:migrate. Itu dia

Dan Anda dapat menulis migrasi lain untuk mengganti nama kolom

 def change
    rename_column :table_name, :old_name, :new_name
  end

Itu dia.


10
2017-12-04 14:34



Jika Anda perlu mengganti nama kolom, Anda perlu membuat placeholder untuk menghindari galat nama kolom duplikat. Inilah contohnya:

class SwitchColumns < ActiveRecord::Migration
  def change
    rename_column :column_name, :x, :holder
    rename_column :column_name, :y, :x
    rename_column :column_name, :holder, :y
  end
end

8
2017-09-09 21:10



Sebagai opsi alternatif, jika Anda tidak menikah dengan ide migrasi, ada permata yang menarik untuk ActiveRecord yang akan menangani perubahan nama secara otomatis untuk Anda, gaya Datamapper. Yang Anda lakukan adalah mengubah nama kolom di model Anda (dan pastikan Anda meletakkannya Model.auto_upgrade! di bagian bawah model Anda.rb) dan biola! Database diperbarui dengan cepat.

https://github.com/DAddYE/mini_record

Catatan: Anda harus melakukan nuke db / schema.rb untuk mencegah konflik

Masih dalam tahap beta dan jelas tidak untuk semua orang tetapi masih merupakan pilihan yang menarik (Saya saat ini menggunakannya dalam dua aplikasi produksi non-sepele tanpa masalah)


7
2018-01-30 20:00



Jika data saat ini tidak penting untuk Anda, Anda dapat menghapus migrasi asli Anda menggunakan:

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

Tanpa tanda kutip, lalu buat perubahan dalam migrasi asli dan jalankan migrasi lagi dengan:

rake db:migrate

6
2017-07-26 09:11