Bunun hased_password
yerine yanlış bir sütunu adlandırdım hashed_password
.
Bu sütunu yeniden adlandırmak için taşıma işlemini kullanarak veritabanı şemasını nasıl güncelleyebilirim?
Bunun hased_password
yerine yanlış bir sütunu adlandırdım hashed_password
.
Bu sütunu yeniden adlandırmak için taşıma işlemini kullanarak veritabanı şemasını nasıl güncelleyebilirim?
Yanıtlar:
rename_column :table, :old_column, :new_column
Bunu yapmak için muhtemelen ayrı bir taşıma oluşturmak isteyeceksiniz. ( FixColumnName
İstediğiniz gibi yeniden adlandırın .):
script/generate migration FixColumnName
# creates db/migrate/xxxxxxxxxx_fix_column_name.rb
Ardından, isteğinizi yapmak için taşıma işlemini düzenleyin:
# 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
Rails 3.1 için:
, İken up
ve down
yöntemler hala geçerli, 3.1 bir alan Raylar change
"için veritabanı geçiş ve göç ayrı aşağı yöntemi yazmaya gerek kalmadan döndürülüyor ne zaman tersine çevirmek için nasıl bilir" bu yöntemi.
Daha fazla bilgi için bkz. " Aktif Kayıt Taşımaları ".
rails g migration FixColumnName
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Yeniden adlandırılacak bir sürü sütununuz varsa veya tablo adını tekrar tekrar tekrarlamanız gereken bir şey varsa:
rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...
change_table
İşleri biraz daha temiz tutmak için kullanabilirsiniz :
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
Sonra db:migrate
her zamanki gibi ya da işinizle ilgili.
Raylar 4 için:
Bir oluştururken Migration
bir sütun yeniden adlandırılması için, 4, bir oluşturur raylar change
yerine yöntemi up
ve down
yukarıda bölümünde belirtildiği gibi. Oluşturulan change
yöntem:
$ > rails g migration ChangeColumnName
aşağıdakine benzer bir taşıma dosyası oluşturur:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
self.up
demem . İçinde göçünüzün bağlamına bağlıdır. Sadece "karşıt" ı koymak "doğru" aşağı göç olmayabilir. self.down
def self.up
ve def self.down
ile değiştirebilirsiniz ve def change
geri almayı bilir.
change
o kadar kullanma eğiliminde, yöntem tam kanıtı olmamasına up
ve down
karmaşık taşıma işlemlerinde yöntemleri.
Kanımca, bu durumda, kullanmak rake db:rollback
, daha sonra geçişinizi düzenlemek ve tekrar çalıştırmak daha iyidir rake db:migrate
.
Ancak, sütunda kaybetmek istemediğiniz verileriniz varsa kullanın rename_column
.
Sütun zaten verilerle doldurulmuş ve üretimde yaşıyorsa, taşıma işlemlerini beklerken üretimde aksama süresini önlemek için adım adım bir yaklaşım öneriyorum.
İlk olarak, yeni ad (lar) içeren sütunlar eklemek ve bunları eski sütun adındaki değerlerle doldurmak için bir db geçişi oluştururdum.
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
Sonra sadece bu değişikliği yapardım ve değişikliği üretime iterdim.
git commit -m 'adding columns with correct name'
Sonra taahhüt üretime girdiğinde, koşardım.
Production $ bundle exec rake db:migrate
Sonra eski sütun adını yeni sütun adına başvuran tüm görünümleri / denetleyicileri güncelleştiririm. Test paketimden geçin ve sadece bu değişiklikleri yapın. (Yerel olarak çalıştığından ve önce tüm testleri geçtikten sonra!)
git commit -m 'using correct column name instead of old stinky bad column name'
Sonra bu taahhüdü üretime iterdim.
Bu noktada, orijinal sütunu, taşımanın kendisiyle ilişkili herhangi bir kesinti süresi hakkında endişelenmeden kaldırabilirsiniz.
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
Ardından bu son geçişi üretime aktarın ve bundle exec rake db:migrate
arka planda çalıştırın .
Bunun bir süreçle biraz daha ilgilendiğinin farkındayım, ancak bunu üretim göçümle ilgili sorunlardan daha çok tercih ederim.
execute "Update table_name set correct_name_column_one = old_name_column_one"
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Altında Available Transformations
rename_column(table_name, column_name, new_column_name):
Bir sütunu yeniden adlandırır, ancak türü ve içeriği tutar.
rename_column
de bakın .
Bir taşıma dosyası oluşturmak için aşağıdaki komutu çalıştırın:
rails g migration ChangeHasedPasswordToHashedPassword
Sonra db/migrate
klasörde oluşturulan dosyaya rename_column
aşağıdaki gibi yazın:
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
Ruby on Rails'in bazı sürümleri geçiş için yukarı / aşağı yöntemini destekler ve geçişinizde yukarı / aşağı yöntemi varsa, o zaman:
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
Taşıma işleminizde change
yöntem varsa , o zaman:
def change
rename_column :table_name, :column_old_name, :column_new_name
end
Daha fazla bilgi için taşıyabilirsiniz: Ruby on Rails - Taşıma veya Aktif Kayıt Taşıma .
Kodunuzu diğeri paylaşılmaz, o zaman en iyi seçenek sadece yapmaktır rake db:rollback
sonra göç ve içinde sütun adını düzenleyin rake db:migrate
. Bu kadar
Sütunu yeniden adlandırmak için başka bir taşıma yazabilirsiniz
def change
rename_column :table_name, :old_name, :new_name
end
Bu kadar.
rake db:rollback
harika bir öneri. Ama dediğin gibi, sadece göç henüz itilmemişse.
Alternatif bir seçenek olarak, taşıma fikriyle evli değilseniz, ActiveRecord için ad değişikliklerini sizin için otomatik olarak ele alan Datamapper stili vardır. Tek yapmanız gereken modelinizdeki sütun adını değiştirmek (ve Model.auto_upgrade! ' İ model.rb'nin altına yerleştirdiğinizden emin olun ) ve viyola! Veritabanı anında güncellenir.
https://github.com/DAddYE/mini_record
Not: Çakışmaları önlemek için db / schema.rb'yi tıklamanız gerekir.
Hala beta aşamalarında ve açıkçası herkes için değil ama yine de zorlayıcı bir seçim (şu anda bunu sorun olmayan iki önemsiz üretim uygulamasında kullanıyorum)
Sütun adlarını değiştirmeniz gerekirse, yinelenen bir sütun adı hatasını önlemek için bir yer tutucu oluşturmanız gerekir . İşte bir örnek:
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
Mevcut veriler sizin için önemli değilse, orijinal taşıma işleminizi aşağıdakileri kullanarak silebilirsiniz:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
Tırnak işaretleri olmadan, orijinal taşımada değişiklikler yapın ve yukarı taşıma işlemini şu şekilde tekrar çalıştırın:
rake db:migrate
Ruby on Rails 4 için:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
Manuel olarak aşağıdaki yöntemi kullanabiliriz:
Taşıma işlemini manuel olarak düzenleyebiliriz:
Açık app/db/migrate/xxxxxxxxx_migration_file.rb
Güncelleme hased_password
içinhashed_password
Aşağıdaki komutu çalıştırın
$> rake db:migrate:down VERSION=xxxxxxxxx
Ardından taşıma işleminizi kaldıracak:
$> rake db:migrate:up VERSION=xxxxxxxxx
Güncellenen değişiklikle taşıma işleminizi ekleyecektir.
Çalıştır rails g migration ChangesNameInUsers
(ya da adlandırmak istersen)
Sadece oluşturulduktan göç dosyasını açın ve (arada yönteminde bu satırı ekleyin def change
ve end
):
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
Dosyayı kaydedin rake db:migrate
ve konsolda çalıştırın
schema.db
Veritabanında adın gerçekten değişip değişmediğini görmek için göz atın !
Bu yardımcı olur umarım :)
Diyelim KISS . Tek yapmanız gereken üç basit adım. Rails 5.2 için aşağıdakiler geçerlidir .
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
- bu şekilde daha sonra kod tabanının sahiplerine mükemmel bir şekilde açıktır. (tablo adı için çoğul kullanın).
# I prefer to explicitly write the
yukarı and
aşağımethods.
# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
def up
# rename_column :table_name, :old_column, :new_column
rename_column :students, :name, :full_name
end
def down
# Note that the columns are reversed
rename_column :students, :full_name, :name
end
end
rake db:migrate
Ve yarışlara gidiyorsun!
$: rails g migration RenameHashedPasswordColumn
invoke active_record
create db/migrate/20160323054656_rename_hashed_password_column.rb
Bu taşıma dosyasını açın ve aşağıdaki gibi değiştirin (Orijinal belgenizi girin table_name
)
class RenameHashedPasswordColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
Ruby on Rails konsolunuzu açın ve şunu girin:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
Bunu yapmanın iki yolu var:
Bu tipte, geri alma sırasında otomatik olarak ters kodunu çalıştırır.
def change
rename_column :table_name, :old_column_name, :new_column_name
end
Bu türe, ne zaman yukarı yöntemini rake db:migrate
çalıştırır ve ne zaman aşağı yöntemini çalıştırır rake db:rollback
:
def self.up
rename_column :table_name, :old_column_name, :new_column_name
end
def self.down
rename_column :table_name,:new_column_name,:old_column_name
end
Ben raylar 5.2, ve bir tasarlanan Kullanıcı bir sütun yeniden adlandırmaya çalışıyorum.
rename_column
Biraz benim için çalıştı, ancak tekil :table_name
bir attı hatası "Kullanıcı tablosunun bulunamadı". Çoğul benim için çalıştı.
rails g RenameAgentinUser
Ardından taşıma dosyasını şu şekilde değiştirin:
rename_column :users, :agent?, :agent
Nerede: ajan? eski sütun adıdır.
Güncelleme - create_table'ın yakın bir kuzeni change_table'dır ve mevcut tabloları değiştirmek için kullanılır. Create_table için benzer bir şekilde kullanılır, ancak bloğa verilen nesne daha fazla numara bilir. Örneğin:
class ChangeBadColumnNames < ActiveRecord::Migration
def change
change_table :your_table_name do |t|
t.rename :old_column_name, :new_column_name
end
end
end
Bu şekilde aşağıdakiler gibi diğer değiştirme yöntemleri ile yaparsak daha verimli oluruz: indeksi kaldır / ekle / indeksi kaldır / sütun ekle, örneğin aşağıdakileri de yapabiliriz:
# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...
Sadece komutu kullanarak taşıma oluşturun
rails g migration rename_hased_password
Bundan sonra, taşıma yönteminde geçişi aşağıdaki satırı ekleyin
rename_column :table, :hased_password, :hashed_password
Bu hile yapmalı.
5 geçiş değişikliğini raylar
Örneğin:
rails g model Öğrenci student_name: string age: integer
öğrenci_adı sütununu ad olarak değiştirmek istiyorsanız
Not: - rayları çalıştırmazsanız db: migrate
Aşağıdaki adımları uygulayabilirsiniz
raylar d modeli Öğrenci öğrenci_adı: string age: integer
Bu oluşturulan taşıma dosyasını kaldıracak, Şimdi sütun adınızı düzeltebilirsiniz
rails g model Öğrenci adı: string age: integer
Taşındıysanız (raylar db: migrate), sütun adını değiştirmek için aşağıdaki seçenekler
rails g migration RemoveStudentNameFromStudent student_name: string
rails g geçiş AddNameToStudent name: string
rails g migration RemoveStudentNameFromStudentS student_name:string
(öğrenciler çoğuldur)?