Ik heb een kolom ten onrechte de naam hased_password
gegeven 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 FixColumnName
zoals 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 up
en down
nog 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_table
kunnen 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:migrate
zoals gewoonlijk of hoe u uw bedrijf ook aanpakt.
Voor rails 4:
Tijdens het maken van een Migration
voor het hernoemen van een kolom, genereert Rails 4 een change
-methode in plaats van up
en down
zoals vermeld in het bovenstaande gedeelte. De gegenereerde change
methode 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:rollback
te gebruiken, vervolgens je migratie te bewerken en rake db:migrate
opnieuw 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:migrate
op 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:rollback
te 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 change
methode 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_column
zoals 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_password
naarhashed_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 change
en end
):
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
Sla het bestand op en voer rake db:migrate
uit in de console
Bekijk uw schema.db
om 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 the
upand
downmethods.
# ./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_name
in)
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 SKU
en 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:
-
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
-
Op dit type wordt de UP-methode uitgevoerd wanneer
rake db:migrate
en voert de DOWN-methode uit wanneerrake 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_column
Bit Werkte voor mij, maar de enkelvoud :table_name
Goode 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