¿Cómo puedo cambiar el nombre de una columna de base de datos en una migración de Ruby on Rails?
-
22-09-2019 - |
Pregunta
Me llamó erróneamente un hased_password
columna en lugar de hashed_password
.
¿Cómo puedo actualizar el esquema de base de datos, mediante la migración a cambiar el nombre de esta columna?
Solución
rename_column :table, :old_column, :new_column
Actualización:
Usted probablemente querrá para crear una migración independiente para hacer esto. (Cambiar nombre FixColumnName como se quiere)
script/generate migration FixColumnName
# creates db/migrate/xxxxxxxxxx_fix_column_name.rb
A continuación, edite la migración para hacer tu 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
Una actualización para Rails 3.1
se siguen aplicando métodos Mientras que, el up
y down
. Carriles de 3.1 recibe un método que change
"sabe cómo migrar su base de datos y marcha atrás cuando la migración se deshace sin el necesidad de escribir un método por separado "
rails g migration FixColumnName
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Si le sucede que tiene un montón de columnas para cambiar el nombre, o algo que habría 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
...
Se podría utilizar change_table
para mantener las cosas un poco más ordenado.
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
Gracias, Luke
&& Turadg
, por traer a colación el tema.
A continuación, sólo db:migrate
como de costumbre o como usted va sobre su negocio.
Una actualización para los carriles 4
Durante la creación de un Migration
como para cambiar el nombre de una columna, los carriles 4 genera un método change
en lugar de up
y down
como se menciona en la respuesta anterior. El método change
generado es como a continuación:
$ > rails g migration ChangeColumnName
lo que creará un archivo de migración similar a esto:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Otros consejos
OMI, en este caso, un mejor uso rake db:rollback
. A continuación, edite la migración y de nuevo tipo rake db:migrate
. Sin embargo, si tiene datos de la columna que no quieren perder, a continuación, utilizar rename_column
.
Si la columna ya se rellena con datos y en directo en la producción, lo recomiendo un enfoque paso a paso, con el fin de evitar el tiempo de inactividad en la producción a la espera de las migraciones.
En primer lugar me gustaría crear una migración db añadir columnas con el nuevo nombre (s) y rellenar con los valores del antiguo nombre de la columna.
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
A continuación, me gustaría cometer simplemente que el cambio, y empujar el cambio en la producción.
git commit -m 'adding columns with correct name'
A continuación, una vez que el commit ha sido empujado en la producción, había corrido.
Production $ bundle exec rake db:migrate
A continuación, me gustaría actualizar todos los puntos de vista / controladores que hace referencia el nombre de columna antiguo al nuevo nombre de la columna. Ejecutar a través de mi banco de pruebas, y comprometerse a solo esos cambios. (Después de asegurarse de que estaba trabajando a nivel local y pasar todas las pruebas de primera!)
git commit -m 'using correct column name instead of old stinky bad column name'
Entonces me empujo de que se comprometan a la producción.
En este punto se puede quitar la columna original sin tener que preocuparse acerca de cualquier tipo de tiempo de inactividad asociado a la migración en sí misma.
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
A continuación, empujar esta última migración a la producción y ejecución bundle exec rake db:migrate
en el fondo.
Me di cuenta que es un poco más complicado de un proceso, pero prefiero hacer esto que tienen problemas con mi migración producción.
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Bajo Available Transformations
rename_column(table_name, column_name, new_column_name):
Cambia el nombre de una columna pero mantiene el tipo y el contenido.
Ejecutar el siguiente comando para crear un archivo de migración:
rails g migration ChangeHasedPasswordToHashedPassword
A continuación, en el archivo generado en la carpeta db/migrate
, rename_column
escribir de la siguiente manera:
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
A partir de la API:
rename_column(table_name, column_name, new_column_name)
Se cambia el nombre de una columna pero mantiene el tipo y el contenido sigue siendo igual.
Algunas versiones de Ruby on Rails apoyo a arriba / abajo método para la migración y si tiene arriba / abajo método en su migración, a continuación:
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 usted tiene el método change
en su migración, a continuación:
def change
rename_column :table_name, :column_old_name, :column_new_name
end
Para obtener más información se puede mover: Ruby on Rails - Las migraciones o Active Record migraciones .
Si el código no se comparte con otro, entonces la mejor opción es hacer precisamente rake db:rollback
y modifique el nombre de la columna en la migración y rake db:migrate
. Eso es todo
Y se puede escribir otra migración a cambiar el nombre de la columna
def change
rename_column :table_name, :old_name, :new_name
end
Eso es todo.
Si es necesario cambiar los nombres de columna que necesitará para crear un marcador de posición para evitar una duplicado de error nombre de la columna . He aquí 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
Como opción alternativa, si no está casado con la idea de las migraciones, hay una joya de peso para ActiveRecord que manejará el nombre cambia automáticamente para usted, DataMapper estilo. Todo lo que hacemos es cambiar el nombre de la columna en el modelo (y asegúrese de poner Model.auto_upgrade! en la parte inferior de su model.rb) y la viola! La base de datos se actualiza en tiempo real.
https://github.com/DAddYE/mini_record
Nota: Usted tendrá que bombardear db / schema.rb para evitar conflictos
Aún en fases beta y, obviamente, no para todos, pero sigue siendo una opción atractiva (actualmente lo estoy usando en dos aplicaciones de producción no triviales, sin problemas)
Si los datos actuales no es importante para usted, usted puede simplemente hacer caer el original usando la migración:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
Sin las comillas, a continuación, hacer cambios en la migración original y ejecutar la migración de nuevo por:
rake db:migrate
Simplemente crear una nueva migración, y en un bloque, el uso rename_column
como a continuación.
rename_column :your_table_name, :hased_password, :hashed_password
Para rubí en los carriles 4:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
manualmente podemos utilizar el siguiente método:
Podemos editar manualmente la migración como:
-
app/db/migrate/xxxxxxxxx_migration_file.rb
Abrir -
Actualizar
hased_password
ahashed_password
-
Ejecutar el siguiente comando
$> rake db:migrate:down VERSION=xxxxxxxxx
A continuación, se eliminará la migración:
$> rake db:migrate:up VERSION=xxxxxxxxx
Se añade la migración con el cambio actualizado.
Generar el archivo de migración:
rails g migration FixName
# Crea db / migrate / xxxxxxxxxx.rb
Editar la migración para hacer tu voluntad.
class FixName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Ejecutar rails g migration ChangesNameInUsers
(o lo que sea que le gustaría darle un nombre)
Abrir el archivo de migración que acaba de ser generado, y añadir esta línea en el método (en el medio def change
y end
):
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
Guardar el archivo y ejecute rake db:migrate
en la consola
Confirmar su schema.db
con el fin de ver si el nombre ha cambiado realmente en la base de datos!
Espero que esto ayude:)
$: rails g migration RenameHashedPasswordColumn
invoke active_record
create db/migrate/20160323054656_rename_hashed_password_column.rb
Abrir el archivo de migración y modificar el archivo de la siguiente manera (Do introduzca su table_name
originales)
class RenameHashedPasswordColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
def change
rename_column :table_name, :old_column_name, :new_column_name
end
Generar un rubí en los carriles de migración
$:> rails g migration Fixcolumnname
Insertar código en el archivo de migración (XXXXXfixcolumnname.rb)
class Fixcolumnname < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
1. Crear una migración
-
rails g migration RenameNameToFullNameInStudents
-
rails g RenameOldFieldToNewFieldInTableName
- de esa manera está perfectamente claro a los mantenedores de la base de código más adelante. (Utilizar un plural para el nombre de la tabla).
2. Editar la migración
# 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. Ejecutar sus migraciones
rake db:migrate
Y usted está fuera de las carreras!
Abra el rubí en los carriles de la consola y escriba:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
Hay dos maneras de hacer esto:
-
En este tipo se ejecuta automáticamente el código inverso de la misma, cuando rollback.
def change rename_column :table_name, :old_column_name, :new_column_name end
-
Para este tipo, se ejecuta el método cuando
rake db:migrate
y ejecuta el método de abajo cuandorake 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 los carriles 5,2, y tratando de cambiar el nombre de una columna en un legado del usuario.
el bit rename_column
trabajó para mí, pero el :table_name
singular lanzó una "tabla de usuario no encontrado" de error. Plural trabajó para mí.
rails g RenameAgentinUser
A continuación, archivo de migración cambio a esto:
rename_column :users, :agent?, :agent
Donde: agente? es el antiguo nombre de la columna.
Sólo generar la migración con el comando
rails g migration rename_hased_password
Después de que la migración de edición complemento siguiente línea en el método de cambio
rename_column :table, :hased_password, :hashed_password
Esto debería hacer el truco.
Carriles 5 migración cambios
por ejemplo:
carriles student_name g modelo Student: edad cadena: entero
Si desea cambiar student_name columna como nombre
Nota: - Si no ejecuta carriles db: migrate
Se puede hacer siguiendo los pasos
carriles d student_name modelo de estudiante: edad cadena: entero
Este archivo de migración eliminará generado, Ahora se puede corregir el nombre de la columna
carriles g modelo Nombre del estudiante: edad cadena: entero
Si ha migrado (carriles db: migrate), a raíz de opciones a cambio de nombre de la columna
carriles g migración RemoveStudentNameFromStudent student_name: cadena
raíles g migración AddNameToStudent nombre: cadena
Actualizar - Un primo cercano del create_table es change_table, que se utiliza para cambiar las tablas existentes. Se utiliza de una manera similar a CREATE_TABLE pero el objeto cedido al bloque sabe 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
De esta manera es más eficiente si hacemos con otros métodos alter como: remove / index add / index remove / columna complemento, por ejemplo, podemos hacer aún más 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
#...