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?
fuente
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?
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íaself.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
ydef self.down
condef change
y sabrá cómo deshacer.change
método no es plena prueba, por lo que tienden a utilizarup
ydown
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 ejecutarrake db:migrate
.Sin embargo, si tiene datos en la columna que no desea perder, utilícelos
rename_column
.fuente
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.
Entonces cometería ese cambio y empujaría el cambio a producción.
Luego, una vez que el commit ha sido empujado a la producción, corría.
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!)
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í.
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.
fuente
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.
fuente
rename_column
.Ejecute el siguiente comando para crear un archivo de migración:
Luego, en el archivo generado en la
db/migrate
carpeta, escribarename_column
lo siguiente:fuente
De API:
Cambia el nombre de una columna pero mantiene el tipo y el contenido sigue siendo el mismo.
fuente
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:
Si tiene el
change
método en su migración, entonces:Para obtener más información, puede mover: Ruby on Rails - Migraciones o Migraciones de registros activos .
fuente
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 esY puede escribir otra migración para cambiar el nombre de la columna
Eso es.
fuente
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)
fuente
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:
fuente
Si los datos actuales no son importantes para usted, puede eliminar su migración original usando:
Sin las comillas, realice cambios en la migración original y vuelva a ejecutar la migración:
fuente
Simplemente cree una nueva migración y, en un bloque, úsela
rename_column
como se muestra a continuación.fuente
Para Ruby on Rails 4:
fuente
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
Luego eliminará su migración:
Agregará su migración con el cambio actualizado.
fuente
Genere el archivo de migración:
# Crea db / migrate / xxxxxxxxxx.rb
Edite la migración para hacer su voluntad.
fuente
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
yend
):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 :)
fuente
Vamos a BESO . Todo lo que se necesita son tres simples pasos. Lo siguiente funciona para Rails 5.2 .
1) Crear una migración
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).2. Edite la migración
# I prefer to explicitly write the
arribaand
abajomethods.
# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
3. Ejecute sus migraciones
rake db:migrate
¡Y te vas a las carreras!
fuente
Abra ese archivo de migración y modifique ese archivo como se muestra a continuación (ingrese su original
table_name
)fuente
fuente
Generar una migración de Ruby on Rails :
Inserte el código en el archivo de migración (XXXXXfixcolumnname.rb) :
fuente
Abra su consola Ruby on Rails e ingrese:
fuente
Tienes dos formas de hacer esto:
En este tipo, ejecuta automáticamente el código inverso al retroceder.
Para este tipo, ejecuta el método up cuando
rake db:migrate
y ejecuta el método down cuandorake db:rollback
:fuente
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í.Luego cambie el archivo de migración a esto:
Donde: agente? es el antiguo nombre de columna.
fuente
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:
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:
fuente
Solo genera la migración usando el comando
Después de eso, edite la migración y agregue la siguiente línea en el método de cambio
Esto debería funcionar.
fuente
Rails 5 cambios de migración
p.ej:
si quieres cambiar la columna student_name como nombre
Nota: - si no ejecuta rails db: migrate
Puedes hacer los siguientes pasos
Esto eliminará el archivo de migración generado. Ahora puede corregir el nombre de su columna
Si migró (rails db: migrate), siga las opciones para cambiar el nombre de la columna
fuente
rails g migration RemoveStudentNameFromStudentS student_name:string
(los estudiantes son plurales)?