Rails: hoe kan ik de naam van een databasekolom in een Ruby on Rails-migratie wijzigen?

Ik heb een kolom ten onrechte de naam hased_passwordgegeven in plaats van hashed_password.

Hoe werk ik het databaseschema bij door migratie te gebruiken om deze kolom te hernoemen?


Antwoord 1, autoriteit 100%

rename_column :table, :old_column, :new_column

Hiervoor wilt u waarschijnlijk een afzonderlijke migratie maken. (Hernoem FixColumnNamezoals je wilt.):

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

Bewerk vervolgens de migratie om uw wil te doen:

# 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

Gebruik voor Rails 3.1:

Hoewel de methoden upen downnog steeds van toepassing zijn, ontvangt Rails 3.1 een change-methode die “weet hoe uw database moet worden gemigreerd en omgekeerd het wanneer de migratie wordt teruggedraaid zonder de noodzaak om een aparte down-methode te schrijven”.

Zie “Actieve recordmigraties” voor meer informatie.

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

Als u een hele reeks kolommen moet hernoemen, of iets waarvoor u de tabelnaam steeds opnieuw moet herhalen:

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

Je zou change_tablekunnen gebruiken om het een beetje netter te houden:

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

Vervolgens db:migratezoals gewoonlijk of hoe u uw bedrijf ook aanpakt.


Voor rails 4:

Tijdens het maken van een Migrationvoor het hernoemen van een kolom, genereert Rails 4 een change-methode in plaats van upen downzoals vermeld in het bovenstaande gedeelte. De gegenereerde changemethode is:

$ > rails g migration ChangeColumnName

die een migratiebestand zal maken dat lijkt op:

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

Antwoord 2, autoriteit 3%

Naar mijn mening is het in dit geval beter om rake db:rollbackte gebruiken, vervolgens je migratie te bewerken en rake db:migrateopnieuw uit te voeren.

Als u echter gegevens in de kolom heeft die u niet wilt verliezen, gebruik dan rename_column.


Antwoord 3

Als de kolom al is ingevuld met gegevens en in productie, zou ik een stapsgewijze aanpak aanbevelen, om downtime in productie te voorkomen tijdens het wachten op de migraties.

Eerst zou ik een DB-migratie maken om kolommen toe te voegen met de nieuwe naam (en) en vult ze met de waarden van de oude kolomnaam.

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

Dan zou ik gewoon die verandering plegen en de verandering in de productie duwen.

git commit -m 'adding columns with correct name'

Nadat de commit in de productie is geduwd, zou ik rennen.

Production $ bundle exec rake db:migrate

Dan zou ik alle weergaven / controllers bijwerken die de oude kolomnaam naar de nieuwe kolomnaam verwijst. Voer door mijn testsuite en plegen alleen die wijzigingen. (Nadat hij er zeker van is, werkte het lokaal en passeer eerst alle tests!)

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

Dan duwde ik die commit aan de productie.

Op dit punt kunt u de originele kolom verwijderen zonder u zorgen te maken over elke soort downtime geassocieerd met de migratie zelf.

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

Duw vervolgens deze nieuwste migratie naar productie en voer bundle exec rake db:migrateop de achtergrond.

Ik realiseer me dat dit een beetje meer betrokken is bij een proces, maar ik doe liever dit dan problemen met mijn productiemigratie.


4

onder Available Transformations

rename_column(table_name, column_name, new_column_name):

Hernoem een ​​kolom, maar houdt het type en de inhoud.


5

Vanaf API:

rename_column(table_name, column_name, new_column_name)

Het hernoemt een kolom, maar houdt het type en inhoud van hetzelfde.


6

Als uw code niet wordt gedeeld met andere, dan is de beste optie om slechts rake db:rollbackte doen
Bewerk vervolgens uw kolomnaam in migratie en rake db:migrate. Dat is het

En u kunt een andere migratie schrijven om de kolom te hernoemen

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

Dat is het.


7

Sommige versies van Ruby on Rails ondersteunen de up / down-methode op migratie en als u een up / down-methode hebt in uw migratie, dan:

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

Als u de changemethode in uw migratie, dan:

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

Voor meer informatie kunt u verplaatsen: Ruby on rails – Migraties of actieve record migraties .


8

Als alternatieve optie, als u niet getrouwd bent met het idee van migraties, is er een overtuigend juweeltje voor activerecord die de naam automatisch wijzigt voor u, datamapper-stijl. Het enige dat u doet is de kolomnaam in uw model wijzigen (en zorg ervoor dat u model.auto_upgrade! onderaan uw model.rb) en altviool hebt gezet! Database wordt op de vlucht bijgewerkt.

https://github.com/DAddYE/mini_record

Opmerking: u moet db/schema.rbvernietigen om conflicten te voorkomen

Nog steeds in bètafasen en natuurlijk niet voor iedereen, maar nog steeds een overtuigende keuze (ik gebruik het momenteel in twee niet-triviale productie-apps zonder problemen)


Antwoord 9

Als u van kolomnaam moet wisselen, moet u een tijdelijke aanduiding maken om een fout met dubbele kolomnaamte voorkomen. Hier is een voorbeeld:

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

Antwoord 10

Als de huidige gegevens niet belangrijk voor u zijn, kunt u uw oorspronkelijke migratie gewoon ongedaan maken met:

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

Breng zonder de aanhalingstekens wijzigingen aan in de oorspronkelijke migratie en voer de migratie opnieuw uit door:

rake db:migrate

Antwoord 11

Maak eenvoudig een nieuwe migratie en gebruik in een blok rename_columnzoals hieronder.

rename_column :your_table_name, :hased_password, :hashed_password

Antwoord 12

Voor Ruby on Rails 4:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end

Antwoord 13

Handmatig kunnen we de onderstaande methode gebruiken:

We kunnen de migratie handmatig bewerken zoals:

  • Open app/db/migrate/xxxxxxxxx_migration_file.rb

  • Update hased_passwordnaar hashed_password

  • Voer de onderstaande opdracht uit

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

Vervolgens wordt uw migratie verwijderd:

$> rake db:migrate:up VERSION=xxxxxxxxx

Het zal uw migratie toevoegen met de bijgewerkte wijziging.


Antwoord 14

Genereer het migratiebestand:

rails g migration FixName

# Creëert db/migrate/xxxxxxxxxxxx.rb

Bewerk de migratie om uw wil te doen.

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

Antwoord 15

Run rails g migration ChangesNameInUsers(of hoe je het ook wilt noemen)

Open het zojuist gegenereerde migratiebestand en voeg deze regel toe aan de methode (tussen def changeen end):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

Sla het bestand op en voer rake db:migrateuit in de console

Bekijk uw schema.dbom te zien of de naam daadwerkelijk is gewijzigd in de database!

Hopelijk helpt dit 🙂


Antwoord 16

Laten we KISS. Het enige dat nodig is, zijn drie eenvoudige stappen. Het volgende werkt voor Rails 5.2.

1 . Een migratie maken

  • rails g migration RenameNameToFullNameInStudents

  • rails g RenameOldFieldToNewFieldInTableName– op die manier is het later volkomen duidelijk voor beheerders van de codebase. (gebruik een meervoud voor de tabelnaam).

2. Bewerk de migratie

# I prefer to explicitly write theupanddownmethods.

# ./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. Voer uw migraties uit

rake db:migrate

En je gaat naar de races!


Antwoord 17

Genereer een Ruby on Rails-migratie:

$:> rails g migration Fixcolumnname

Voeg code in het migratiebestand in (XXXXXfixcolumnname.rb):

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

Antwoord 18

$:  rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

Open dat migratiebestand en wijzig dat bestand zoals hieronder (Voer uw originele table_namein)

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

Antwoord 19

def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

Antwoord 20

Ik had deze uitdaging bij het werken aan een Rails 6-applicatie met PostgreSQL-database.

Zo heb ik het opgelost:

In mijn geval was de table_nameProducts, de old_columnwas SKUen de new_columnwas ProductNumber:

Maak een migratiebestand met de opdracht voor het hernoemen van de kolom:

rails generate migration RenameSKUToProductNumberInProducts

Open het migratiebestand in de db/migrate directory:

db/migrate/20201028082344_rename_sku_to_product_number_in_products.rb

Voeg de opdracht toe voor het hernoemen van de kolom:

class RenameSkuToProductNumberInProducts < ActiveRecord::Migration[6.0]
  def change
    # rename_column :table_name, :old_column, :new_column
    rename_column :products, :sku, :product_number
  end
end

Opslaan en vervolgens de migratieopdracht uitvoeren:

rails db:migrate

U kunt nu de hernieuwing van de kolom bevestigen door het schema-bestand te bekijken:

db/schema.rb

Als u niet tevreden bent met de hernieuwing van de kolom, kunt u altijd terugdraaien:

rails db:rollback

Opmerking : TOEPASSEN Om de kolomnaam aan te passen aan de nieuwe naam op alle plaatsen waar het wordt genoemd.

Dat is alles.

Ik hoop dat dit

helpt


21

Open uw Ruby on Rails-console en voer:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

22

U hebt twee manieren om dit te doen:

  1. In dit type voert het automatisch de omgekeerde code uit, bij rollback.

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. Op dit type wordt de UP-methode uitgevoerd wanneer rake db:migrateen voert de DOWN-methode uit wanneer 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
    

23

Ik ben op rails 5.2 en probeer een kolom te hernoemen op een bedenk gebruiker.

De rename_columnBit Werkte voor mij, maar de enkelvoud :table_nameGoode een fout “Gebruikerstabel niet gevonden”. Meervoudswerk voor mij.

rails g RenameAgentinUser

Wijzig vervolgens het migratiebestand naar dit:

rename_column :users, :agent?, :agent

Waar: Agent? is de oude kolomnaam.


24

U kunt een migratie uitvoeren, voert u de onderstaande opdracht uit om de kolomnaam bij te werken:

rename_column :your_table_name, :hased_password, :hashed_password

Zorg er ook voor dat u een gebruik van de oude kolomnaam in uw code bijwerkt met de nieuwe.


25

Update – Een nauwe neef van Create_Table is Change_table, gebruikt voor het wijzigen van bestaande tabellen. Het wordt op dezelfde manier gebruikt om te creëren_table, maar het object leverde aan het blok op kent meer trucs. Bijvoorbeeld:

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

Op deze manier is efficiënter als we doen met andere altermethoden zoals: Verwijderen / toevoegen / verwijderen index / kolom verwijderen, bijvoorbeeld we kunnen verder doen zoals:

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

26

Genereer gewoon migratie met opdracht

rails g migration rename_hased_password

Bewerk de migratie de volgende regel in Wijzigingsmethode

rename_column :table, :hased_password, :hashed_password

Dit zou voldoende moeten zijn.


Antwoord 27

Rails 5 migratiewijzigingen

bijvoorbeeld:

rails g model Student student_name:string age:integer

als je de kolom student_namewilt wijzigen in name

Opmerking:- als u geen rails db:migrate

gebruikt

U kunt de volgende stappen uitvoeren

rails d model Student student_name:string age:integer

Hiermee wordt het gegenereerde migratiebestand verwijderd. Nu kunt u uw kolomnaam corrigeren

rails g model Student naam:string leeftijd:integer

Als u bent gemigreerd(rails db:migrate), volgt u de volgende opties om de kolomnaam te wijzigen

rails g migratie RemoveStudentNameFromStudent student_name:string

rails g migratie AddNameToStudent name:string


Antwoord 28

rails g migration migrationName

Dus u gaat naar uw gegenereerde migratie en voegt toe:

rename_column :table, :old_column, :new_column

naar de methode

Other episodes