Kaip galiu pervardyti duomenų bazės stulpelį „Ruby on Rails“ migracijoje?

Vietoj „ hashed_password neteisingai pavadino „ hased_password stulpelį.

Kaip atnaujinti duomenų bazės schemą naudojant migraciją, kad pervadintumėte šią stulpelį?

1339
02 янв. nustatė user1994764 sausio 02 d 2010-01-02 19:18 '10, 19:18, 2010-01-02 19:18
@ 27 atsakymai
 rename_column :table, :old_column, :new_column 

Atnaujinti:

Jei norite tai padaryti, galite sukurti atskirą perdavimą. (Pervardykite pavadinimą FixColumnName, kaip ir jūs)

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

Tada redaguokite perkėlimą, kad atliktumėte savo valią.

 # 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 

Bėgių atnaujinimas 3.1

Iki šiol naudojami up ir down metodai. Bėgiai 3.1 gauna change metodą, kuris „žino, kaip perkelti savo duomenų bazę ir atšaukti ją, kai perkėlimas grįžta atgal ir nereikia parašyti atskiro metodo žemyn“

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

Jei jums reikia pervardyti visą stulpelių krūvą ar kažką, kas reikalautų kartoti lentelės pavadinimą dar kartą.

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

Galite naudoti „ change_table , kad viskas būtų tvarkinga.

 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 

Ačiū, Luke Turadg , už temos Turadg .

Tada tiesiog db:migrate , kaip įprasta, arba darote savo verslą.


Rails atnaujinimas 4

Kuriant Migration kad pervadintumėte stulpelį, Rails 4 vietoj up ir down generuoja change metodą, kaip nurodyta pirmiau pateiktame atsakyme. Sukurtas change metodas yra toks:

 $ > rails g migration ChangeColumnName 

kuris sukurs migracijos failą, panašų į:

 class ChangeColumnName < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end 
2152
02 янв. atsakymas pateikiamas dabar 02 Jan 2010-01-02 19:31 '10, 19:31, 2010-01-02 19:31

TJO, šiuo atveju geriau naudoti rake db:rollback . Tada redaguokite perkėlimą ir įveskite rake db:migrate vėl rake db:migrate . Tačiau jei stulpelyje yra duomenų, kurių nenorite prarasti, naudokite rename_column .

67
03 янв. atsakymas pateikiamas elf.xf 03 jan. 2010-01-03 03:55 '10 at 3:55 2010-01-03 03:55

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

Skyriuje „ Available Transformations

rename_column(table_name, column_name, new_column_name):

Pervardija stulpelį, tačiau išsaugo tipą ir turinį.

26
02 янв. James Manning atsakymas, sausio 02 2010-01-02 19:26 '10, 19:26, 2010-01-02 19:26

Jei stulpelis jau yra užpildytas duomenimis ir gyvena gamybos proceso metu, aš rekomenduoju laipsnišką metodą, kad būtų išvengta gamybos prastovų, laukiant migracijos.

Pirma, sukūriau db migraciją, kad galėtumėte pridėti stulpelius su naujais pavadinimais ir užpildyti juos iš senojo stulpelio pavadinimo.

 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 

Tada norėčiau padaryti šį pakeitimą ir vilkite jį į gamybą.

 git commit -m 'adding columns with correct name' 

Tada, kai tik įsipareigojimas bus pradėtas gaminti, pradėjau.

 Production $ bundle exec rake db:migrate 

Tada atnaujinau visus rodinius / valdiklius, kurie nurodė senąjį stulpelio pavadinimą į naują stulpelio pavadinimą. Paleisk mano bandymo atvejį ir nukopijuokite tik tuos pakeitimus. (Įsitikinkite, kad jis veikia lokaliai ir pirmiausia perduoda visus testus!)

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

Tuomet norėčiau spausti šį išsprendimą ant gamybos.

Šiuo metu galite ištrinti pradinį stulpelį, nesirūpindami dėl pertraukos, susijusios su pačia migracija.

 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 

Tada spustelėkite šią paskutinę gamybos migraciją ir paleiskite bundle exec rake db:migrate fone.

Suprantu, kad tai šiek tiek labiau susijęs su procesu, bet norėčiau tai padaryti, nei problemos, susijusios su mano gamybos migracija.

24
31 авг. Pettengill atsakymas rugpjūčio 31 d 2013-08-31 01:08 '13, 01:08 2013-08-31 01:08

Norėdami sukurti perkėlimo failą, vykdykite toliau nurodytą komandą:

 rails g migration ChangeHasedPasswordToHashedPassword 

Tada faile, sukurtame aplanke db/migrate rename_column , įrašykite rename_column kaip parodyta toliau:

 class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration def change rename_column :table_name, :hased_password, :hashed_password end end 
16
03 дек. Shoaib Malik atsakymas 03 Dec 2014-12-03 14:45 '14, 14:45 2014-12-03 14:45

Iš API:

 rename_column(table_name, column_name, new_column_name) 

Ji pervardina stulpelį, tačiau išsaugo tą patį tipą ir turinį.

13
18 февр. atsakymą pateikė super_p vasario 18 d. 2011-02-18 14:15 '11 14:15 val. 2011-02-18 14:15

Kai kurios „Ruby on Rails“ versijos palaiko perkėlimo metodą aukštyn / žemyn, o jei perkėlime turite aukštyn / žemyn metodą, tada:

 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 

Jei perkėlimo būdą change , tuomet:

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

Norėdami gauti daugiau informacijos, galite naršyti: „ Ruby on Rails“ - „Migrations“ arba „ Active Record Migrations“ .

12
14 февр. atsakymas duotas uma 14 vas. 2014-02-14 13:38 '14 at 13:38 2014-02-14 13:38

Jei jūsų kodas nėra bendrinamas su kitu, geriausias variantas yra paprasčiausiai rake db:rollback tada perkeliant procesą pakeiskite stulpelio pavadinimą ir rake db:migrate . Tai tai

Ir galite parašyti kitą migraciją, kad pervadintumėte stulpelį

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

Čia tai yra.

10
04 дек. atsakymas suteikiamas saulei 04 dec. 2013-12-04 17:34 '13, 17:34 2013-12-04 17:34

Jei reikia keisti stulpelių pavadinimus, turite sukurti vietos žymeklį, kad išvengtumėte klaidos su dvigubu stulpelio pavadinimu . Štai pavyzdys:

 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
10 сент. Atsakymas, kurį pateikė Abram Sep 10 2013-09-10 00:10 '13 prie 0:10 2013-09-10 00:10

Arba, jei nesate susituokę su migracijos idėja, yra nenugalimas „ActiveRecord“ perlas, kuris automatiškai tvarkys vardų pakeitimus, „Datamapper“ stilių. Viskas, ką jums reikia padaryti, tai pakeisti savo modelio stulpelio pavadinimą (ir įsitikinkite, kad įdėjote Model.auto_upgrade! Jūsų modelio apačioje. Rb) ir altui! Duomenų bazė atnaujinama.

https://github.com/DAddYE/mini_record

Pastaba Norint išvengti konfliktų, reikia naudoti „ nub db / schema.rb“

Vis dar beta stadijoje ir, žinoma, ne visiems, bet vis dar yra įtikinamas pasirinkimas (šiuo metu jį naudoju dviejose nereikšmingose ​​gamybos programose be problemų)

7
30 янв. Steven Garcia atsakymas, pateiktas sausio 30 d 2012-01-30 23:00 '12 23:00 val. 2012-01-30 23:00

Jei duomenys jums nėra svarbūs, galite tiesiog ištrinti pradinę migraciją naudodami:

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

Be kabučių, atlikite pradinės migracijos pakeitimus ir vėl perkelkite:

 rake db:migrate 
7
26 июля '13 в 12:11 2013-07-26 12:11 atsakymas pateikiamas dirtydexter liepos 26 d. 13 val. 12:11 2013-07-26 12:11

Tiesiog sukurkite naują perkėlimą ir naudokite rename_column bloke, kaip parodyta žemiau.

 rename_column :your_table_name, :hased_password, :hashed_password 
6
24 марта '14 в 18:05 2014-03-24 18:05 atsakymas pateikiamas jon sniego kovo 24 d. 14 val. 18:05 2014-03-24 18:05

Ruby on Rails 4:

 def change rename_column :table_name, :column_name_old, :column_name_new end 
6
20 янв. Hardik Hardiya atsakymas sausio 20 d 2015-01-20 17:44 '15, 17:44 2015-01-20 17:44

Rankiniu režimu galime naudoti šį metodą:

Mes galime redaguoti migraciją rankiniu būdu, pavyzdžiui:

  • Atidaryti app/db/migrate/xxxxxxxxx_migration_file.rb

  • Atnaujinimas hased_password kad būtų hashed_password

  • Paleiskite šią komandą

     $> rake db:migrate:down VERSION=xxxxxxxxx 

Tada jis ištrins jūsų perkėlimą:

 $> rake db:migrate:up VERSION=xxxxxxxxx 

Ji pridės jūsų perkėlimą su atnaujintais pakeitimais.

5
14 июля '14 в 16:58 2014-07-14 16:58 atsakymą pateikė „ Sumit Munot “ liepos 14 d. 14 val. 16:58 2014-07-14 16:58

Sukurti migracijos failą:

 rails g migration FixName 

# Sukuria db / migrate / xxxxxxxxxx.rb

Redaguokite migraciją, kad atliktumėte savo valią.

 class FixName < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end 
4
28 дек. Atsakymas suteiktas 28 d. 2015-12-28 16:24 '16, 16:24 pm 2015-12-28 16:24
 $: rails g migration RenameHashedPasswordColumn invoke active_record create db/migrate/20160323054656_rename_hashed_password_column.rb 

Atidarykite šį perkėlimo failą ir redaguokite šį failą, kaip parodyta žemiau (įrašykite pradinį table_name )

 class RenameHashedPasswordColumn < ActiveRecord::Migration def change rename_column :table_name, :hased_password, :hashed_password end end 
4
23 марта '16 в 8:49 2016-03-23 08:49 Atsakymą pristato Prabhakar , kovo 23 d., 16 d., 8:49 2016-03-23 ​​08:49

Paleisti rails g migration ChangesNameInUsers (arba ką norite jį pavadinti)

Atidarykite ką tik sukurtą perkėlimo failą ir pridėkite šią eilutę prie metodo (tarp def change ir end ):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

Išsaugokite failą ir paleiskite rake db:migrate į konsolę

Patikrinkite schema.db kad pamatytumėte, ar pavadinimas tikrai pasikeitė duomenų bazėje!

Tikiuosi, kad tai padės :)

4
23 дек. Atsakymas duotas Maddie 23 d. 2016-12-23 19:10 '16 at 19:10 2016-12-23 19:10
  def change rename_column :table_name, :old_column_name, :new_column_name end 
3
08 июня '17 в 21:01 2017-06-08 21:01 atsakymą pateikė „ Apoorv“ birželio 8 d. 17 d. 21:01 2017-06-08 21:01

„Ruby on Rails“ migracijos kūrimas :

 $:> rails g migration Fixcolumnname 

Įklijuokite kodą į perkėlimo failą (XXXXXfixcolumnname.rb) :

 class Fixcolumnname < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end 
3
26 янв. atsakymą pateikė vipin 26 d. 2016-01-26 15:26 '16 at 15:26 2016-01-26 15:26

Atidarykite „Ruby on Rails“ konsolę ir įveskite:

 ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column 
2
03 июня '15 в 10:46 2015-06-03 10:46 atsakymą pateikė rinold simon birželio 03 '15 , 10:46 2015-06-03 10:46

Jūs galite tai padaryti dviem būdais:

  • Tokiu atveju jis automatiškai suka atvirkštinį kodą, kai jis sukasi atgal.

     def change rename_column :table_name, :old_column_name, :new_column_name end 
  • Šiam tipui jis veikia „up rake db:migrate metodu ir veikia žemyn, kai 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 
2
29 янв. sausio 29 d. atsakymą pateikė Sarwan Kumar 2015-01-29 13:47 '15 at 13:47 2015-01-29 13:47

Aš esu ant bėgių 5.2 ir bandau pervardyti stulpelį vartotojo įrenginyje.

rename_column bit dirbo man, bet vienaskaitoje :table_name rename_column error "Nerasta naudotojų lentelė". Daug darbo man.

 rails g RenameAgentinUser 

Tada pakeiskite perkėlimo failą į:

 rename_column :users, :agent?, :agent 

Kur yra agentas? senojo stulpelio pavadinimas

1
06 сент. atsakymas suteiktas kapui 06 Sep. 2018-09-06 16:42 '18, 4:42 pm 2018-09-06 16:42

Tegul bučinys . Visa tai trunka tris paprastus veiksmus. Darbas su bėgiais 5.2 .

1 Sukurti migraciją

  • rails g migration RenameNameToFullNameInStudents

  • rails g RenameOldFieldToNewFieldInTableName - taigi vėliau tai bus gana aiškiai pridedama prie kodo bazės. (naudokite lentelės pavadinimo daugiskaitą).

2. Redaguokite perkėlimą

# я prefer to explicitly write the methods. aukštyn and žemyn 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 

3. Paleiskite savo migracijas

rake db:migrate

Ir jūs einate į lenktynes!

0
14 янв. Atsakymas pateikiamas BKSpurgeon 14 jan. 2019-01-14 08:06 '19, 08:06 am 2019-01-14 08:06

Tiesiog perkelkite naudodami komandą

 rails g migration rename_hased_password 

Po to redaguokite perkėlimą, pridėkite šią eilutę prie pakeitimo metodo

 rename_column :table, :hased_password, :hashed_password 

Tai turėtų padaryti apgauti.

0
05 окт. atsakymą pateikė Ratnam Yadav 05 okt. 2017-10-05 15:02 '17 15:02 2017-10-05 15:02

Rails 5 migracijos pokyčiai

pavyzdžiui:

bėgiai g modelis Studentų studento vardas: eilutės amžius: sveikasis skaičius

jei norite pakeisti stulpelio studento vardą kaip vardą

Pastaba: - jei nenaudojate bėgių db: migrate

Galite atlikti šiuos veiksmus.

bėgiai d modelis Studento pavadinimas: linijos amžius: sveikasis skaičius

Tai pašalins sukurtą perkėlimo failą, dabar galite pataisyti stulpelio pavadinimą.

bėgiai g modelis Studentų vardas: linijos amžius: sveikasis skaičius

Jei perkėlėte (bėgiai db: migrate), galite keisti stulpelio pavadinimą

bėgiai ir migracija RemoveStudentNameFromStudent student_name: string

bėgiai z migracija AddNameToStudent name: string

0
20 дек. Atsakymas pateikiamas prasanthrubyist 20 d. 2017-12-20 15:08 '17 15:08 2017-12-20 15:08

Arba naudokite execute vykdydami SQL, bet nerekomenduojama

 execute "ALTER TABLE table_name change COLUMN old_column_name new_colmn_name column_data_type;" 
-1
03 дек. Atsakymas suteikiamas 03 d. 2017-12-03 04:46 '17 at 4:46 2017-12-03 04:46

Atnaujinti . Artimiausias „create_table“ pusbrolis yra „change_table“, naudojamas esamoms lentelėms modifikuoti. Jis naudojamas kaip create_table, bet bloko gautas objektas žino daugiau triukų. Pavyzdžiui:

 class ChangeBadColumnNames < ActiveRecord::Migration def change change_table :your_table_name do |t| t.rename :old_column_name, :new_column_name end end end 

Šis metodas yra efektyvesnis, jei tai darome naudojant kitus alternatyvius metodus, pavyzdžiui: pašalinti / pridėti indeksą / pašalinti indeksą / pridėti stulpelį, pvz., Galime atlikti šiuos veiksmus:

 # 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 #... 
-1
21 мая '16 в 8:32 2016-05-21 08:32 atsakymą pateikė Hieu Pham gegužės 16 d. 16 val. 8:32 2016-05-21 08:32

Kiti klausimai apie žymes arba Užduoti klausimą