Erróneamente nombré una columna hased_password
lugar de hashed_password
.
¿Cómo actualizo el esquema de la base de datos, usando la migración para cambiar el nombre de esta columna?
Erróneamente nombré una columna hased_password
lugar de hashed_password
.
¿Cómo actualizo el esquema de la base de datos, usando la migración para cambiar el nombre de esta columna?
Respuestas:
rename_column :table, :old_column, :new_column
Probablemente desee crear una migración separada para hacer esto. (Renombra FixColumnName
como quieras):
script/generate migration FixColumnName
# creates db/migrate/xxxxxxxxxx_fix_column_name.rb
Luego edite la migración para hacer su voluntad:
# 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
Para Rails 3.1 use:
Mientras que los métodos up
y down
todavía se aplican, Rails 3.1 recibe unchange
método que "sabe cómo migrar su base de datos y revertirla cuando la migración se revierte sin la necesidad de escribir un método por separado".
Consulte " Migraciones de registros activos " para obtener más información.
rails g migration FixColumnName
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Si tiene que cambiar un montón de columnas, o algo que hubiera requerido repetir el nombre de la tabla una y otra vez:
rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...
Podrías usar change_table
para mantener las cosas un poco más ordenadas:
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
Luego, db:migrate
como de costumbre o como sea que vayas por tu negocio.
Para rieles 4:
Al crear un Migration
para renombrar una columna, Rails 4 genera un change
método en lugar de up
y down
como se menciona en la sección anterior. El change
método generado es:
$ > rails g migration ChangeColumnName
que creará un archivo de migración similar a:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
self.up
, no diría self.down
" siempre debería ser opuesto". En depende del contexto de su migración. Simplemente poner lo "opuesto" podría no ser la migración hacia abajo "correcta".
def self.up
y def self.down
con def change
y sabrá cómo deshacer.
change
método no es plena prueba, por lo que tienden a utilizar up
y down
métodos para migraciones complejas.
En mi opinión, en este caso, es mejor usar rake db:rollback
, luego editar la migración y volver a ejecutar rake db:migrate
.
Sin embargo, si tiene datos en la columna que no desea perder, utilícelos rename_column
.
Si la columna ya está poblada con datos y vive en producción, recomendaría un enfoque paso a paso, para evitar el tiempo de inactividad en la producción mientras se esperan las migraciones.
Primero, crearía una migración de base de datos para agregar columnas con los nuevos nombres y llenarlas con los valores del nombre de la columna anterior.
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
Entonces cometería ese cambio y empujaría el cambio a producción.
git commit -m 'adding columns with correct name'
Luego, una vez que el commit ha sido empujado a la producción, corría.
Production $ bundle exec rake db:migrate
Luego, actualizaría todas las vistas / controladores que hacían referencia al antiguo nombre de columna al nuevo nombre de columna. Ejecute mi conjunto de pruebas y confirme solo esos cambios. (¡Después de asegurarse de que funcionaba localmente y de aprobar todas las pruebas primero!)
git commit -m 'using correct column name instead of old stinky bad column name'
Luego empujaría ese compromiso a la producción.
En este punto, puede eliminar la columna original sin preocuparse por ningún tipo de tiempo de inactividad asociado con la migración en sí.
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
Luego, empuje esta última migración a producción y ejecútela bundle exec rake db:migrate
en segundo plano.
Me doy cuenta de que esto es un proceso un poco más complicado, pero prefiero hacerlo que tener problemas con mi migración de producción.
execute "Update table_name set correct_name_column_one = old_name_column_one"
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Debajo Available Transformations
rename_column(table_name, column_name, new_column_name):
Renombra una columna pero mantiene el tipo y el contenido.
rename_column
.
Ejecute el siguiente comando para crear un archivo de migración:
rails g migration ChangeHasedPasswordToHashedPassword
Luego, en el archivo generado en la db/migrate
carpeta, escriba rename_column
lo siguiente:
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
Algunas versiones de Ruby on Rails son compatibles con el método arriba / abajo para la migración y si tiene un método arriba / abajo en su migración, entonces:
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
Si tiene el change
método en su migración, entonces:
def change
rename_column :table_name, :column_old_name, :column_new_name
end
Para obtener más información, puede mover: Ruby on Rails - Migraciones o Migraciones de registros activos .
Si su código no se comparte con otro, entonces la mejor opción es simplemente rake db:rollback
editar el nombre de su columna en migración yrake db:migrate
. Eso es
Y puede escribir otra migración para cambiar el nombre de la columna
def change
rename_column :table_name, :old_name, :new_name
end
Eso es.
rake db:rollback
Es una gran sugerencia. Pero como dijiste, solo si la migración aún no se ha impulsado.
Como opción alternativa, si no está casado con la idea de las migraciones, existe una joya convincente para ActiveRecord que se encargará de los cambios de nombre automáticamente, al estilo Datamapper. Todo lo que debe hacer es cambiar el nombre de la columna en su modelo (y asegúrese de poner Model.auto_upgrade! En la parte inferior de su model.rb) y viola! La base de datos se actualiza sobre la marcha.
https://github.com/DAddYE/mini_record
Nota: Necesitarás atacar db / schema.rb para evitar conflictos
Todavía en fases beta y obviamente no para todos, pero sigue siendo una opción convincente (actualmente lo estoy usando en dos aplicaciones de producción no triviales sin problemas)
Si necesita cambiar los nombres de columna, deberá crear un marcador de posición para evitar un error de nombre de columna duplicado . Aquí hay un ejemplo:
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
Si los datos actuales no son importantes para usted, puede eliminar su migración original usando:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
Sin las comillas, realice cambios en la migración original y vuelva a ejecutar la migración:
rake db:migrate
Para Ruby on Rails 4:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
Manualmente podemos usar el siguiente método:
Podemos editar la migración manualmente como:
Abierto app/db/migrate/xxxxxxxxx_migration_file.rb
Actualizar hased_password
ahashed_password
Ejecute el siguiente comando
$> rake db:migrate:down VERSION=xxxxxxxxx
Luego eliminará su migración:
$> rake db:migrate:up VERSION=xxxxxxxxx
Agregará su migración con el cambio actualizado.
Ejecutar rails g migration ChangesNameInUsers
(o como quieras nombrarlo)
Abra el archivo de migración que se acaba de generar y agregue esta línea en el método (entre def change
y end
):
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
Guarde el archivo y ejecútelo rake db:migrate
en la consola.
¡Mira tu schema.db
para ver si el nombre realmente ha cambiado en la base de datos!
Espero que esto ayude :)
Vamos a BESO . Todo lo que se necesita son tres simples pasos. Lo siguiente funciona para Rails 5.2 .
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
- de esa manera queda perfectamente claro para los mantenedores de la base de código más adelante. (use un plural para el nombre de la tabla).
# I prefer to explicitly write the
arriba and
abajomethods.
# ./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
¡Y te vas a las carreras!
$: rails g migration RenameHashedPasswordColumn
invoke active_record
create db/migrate/20160323054656_rename_hashed_password_column.rb
Abra ese archivo de migración y modifique ese archivo como se muestra a continuación (ingrese su original table_name
)
class RenameHashedPasswordColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
Abra su consola Ruby on Rails e ingrese:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
Tienes dos formas de hacer esto:
En este tipo, ejecuta automáticamente el código inverso al retroceder.
def change
rename_column :table_name, :old_column_name, :new_column_name
end
Para este tipo, ejecuta el método up cuando rake db:migrate
y ejecuta el método down cuando 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
Estoy en rails 5.2, e intento cambiar el nombre de una columna en un dispositivo ideado.
el rename_column
bit funcionó para mí, pero el singular :table_name
arrojó un error "No se encontró la tabla de usuario". Plural funcionó para mí.
rails g RenameAgentinUser
Luego cambie el archivo de migración a esto:
rename_column :users, :agent?, :agent
Donde: agente? es el antiguo nombre de columna.
Actualización : un primo cercano de create_table es change_table, que se usa para cambiar las tablas existentes. Se usa de manera similar a create_table pero el objeto cedido al bloque conoce más trucos. Por ejemplo:
class ChangeBadColumnNames < ActiveRecord::Migration
def change
change_table :your_table_name do |t|
t.rename :old_column_name, :new_column_name
end
end
end
Esta forma es más eficiente si lo hacemos con otros métodos alternos como: eliminar / agregar índice / eliminar índice / agregar columna, por ejemplo, podemos hacer más cosas como:
# 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
#...
Solo genera la migración usando el comando
rails g migration rename_hased_password
Después de eso, edite la migración y agregue la siguiente línea en el método de cambio
rename_column :table, :hased_password, :hashed_password
Esto debería funcionar.
Rails 5 cambios de migración
p.ej:
rails modelo g Student student_name: string age: integer
si quieres cambiar la columna student_name como nombre
Nota: - si no ejecuta rails db: migrate
Puedes hacer los siguientes pasos
rieles d modelo Alumno nombre_alumno: edad de la cadena: entero
Esto eliminará el archivo de migración generado. Ahora puede corregir el nombre de su columna
rieles modelo g Nombre del alumno: edad de la cadena: entero
Si migró (rails db: migrate), siga las opciones para cambiar el nombre de la columna
rieles g migración RemoveStudentNameFromStudent student_name: string
rails g migración AddNameToStudent nombre: cadena
rails g migration RemoveStudentNameFromStudentS student_name:string
(los estudiantes son plurales)?