我怎么能重新命名一个数据库中列的红宝石在轨道上移徙?
-
22-09-2019 - |
题
我错误地命名的一栏 hased_password
而不是的 hashed_password
.
我如何更新的数据库模式,采用迁移到重新命名这个专栏?
解决方案
rename_column :table, :old_column, :new_column
<强>更新强>
您可能会想创建一个单独的迁移做到这一点。 (重命名为FixColumnName你会)
script/generate migration FixColumnName
# creates db/migrate/xxxxxxxxxx_fix_column_name.rb
然后编辑迁移到你的旨意。
# 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
作为滑轨3.1的更新强>
虽然,所述up
和down
方法仍然适用。 Rails的3.1接收一个change
方法“知道如何迁移数据库和扭转它,当迁移回滚而不需要编写单独的向下方法“
rails g migration FixColumnName
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
如果你碰巧有一大堆列重命名,或者说这样做需要一遍又一遍的重复表名。
rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...
您可以使用change_table
让事情变得更加整洁。
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
谢谢,Luke
&& Turadg
,为使这个话题。的
然后,只需db:migrate
像往常一样或无论你去了解你的业务。
作为轨道4的更新强>
在创建Migration
作为用于重命名的列,轨道4如在上面提到的答案生成change
方法而不是up
和down
。所生成的change
方法如下:
$ > rails g migration ChangeColumnName
,这将产生类似于此迁移文件:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
其他提示
IMO,在这种情况下,更好地利用rake db:rollback
。然后编辑您的迁移,并再次键入rake db:migrate
。但是,如果在列有数据你不想失去,然后用rename_column
。
如果该列已经被填充数据和现场生产,我建议一个循序渐进的方式,以避免停机生产在等待迁移。
首先我想创建一个分贝迁移到与所述新的名称(一个或多个)添加列,并与来自旧列名的值填充它们。
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
然后我提交只是变化,和推变化到生产中。
git commit -m 'adding columns with correct name'
然后,一旦提交已被推入生产,我会运行。
Production $ bundle exec rake db:migrate
然后,我更新所有视图/控制器,引用旧列名到新的列名的。经过我的测试套件运行,并承诺只是那些变化。 (确保它在本地工作,首先通过了所有的测试后!)
git commit -m 'using correct column name instead of old stinky bad column name'
然后,我推送提交到生产环境。
此时可以不必担心任何种类与迁移本身相关联的停机时间的删除原始列。
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
然后向里推背景这个最新迁移到生产和运行bundle exec rake db:migrate
。
我意识到这是多一点参与的过程,但我宁愿这样做不是有问题,与我的生产迁移。
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
在Available Transformations
rename_column(table_name, column_name, new_column_name):
重命名的列,但保持的类型和内容。
运行下面的命令来创建迁移文件:
rails g migration ChangeHasedPasswordToHashedPassword
然后在db/migrate
文件夹中生成的文件写入rename_column
如下:
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
从API:
rename_column(table_name, column_name, new_column_name)
有重命名的列,但保持的类型和含量保持相同。
红宝石的上了Rails的支持某些版本/向下的方法来迁移,如果你有向上/向下方法迁移,那么:
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
如果您有change
方法迁移,那么:
def change
rename_column :table_name, :column_old_name, :column_new_name
end
有关详细信息,您可以移动 Ruby on Rails的 - 迁移 或 活动记录迁移
如果你的代码不与其它一个共享的,那么最好的选择就是做只是rake db:rollback
然后编辑在迁移和rake db:migrate
您的列名。这就是它
和可以写另一个迁移到重命名列
def change
rename_column :table_name, :old_name, :new_name
end
那它。
如果你需要切换列名,您将需要创建一个占位符,以避免重复的列名错误。下面是一个例子:
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
作为另一种选择,如果你不结婚移民的想法,有ActiveRecord的一个引人注目的宝石将处理的名称自动为您更改,DataMapper的风格。你要做的就是在模型中更改列名(并确保你把 Model.auto_upgrade!是在您的model.rb的底部)和中提琴!数据库更新的飞行。
https://github.com/DAddYE/mini_record
请注意:您需要将核弹的 DB / schema.rb ,以防止冲突
仍处于测试阶段,显然并不适合每个人,但仍然有吸引力的选择(我目前正在使用这两个不平凡的生产应用程序没有问题)
如果目前的数据是不是对你很重要,你可以记下你的原迁移使用:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
没有引号,然后使在原来的迁移的变化和通过再次运行向上迁移:
rake db:migrate
简单地创建一个新的迁移,并且在一个块中,使用rename_column
如下。
rename_column :your_table_name, :hased_password, :hashed_password
有关红宝石:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
手动,我们可以使用以下方法:
我们可以编辑的移徙手动,如:
打开
app/db/migrate/xxxxxxxxx_migration_file.rb
更新
hased_password
要hashed_password
运行以下的命令
$> rake db:migrate:down VERSION=xxxxxxxxx
然后它会去除你的迁移:
$> rake db:migrate:up VERSION=xxxxxxxxx
它将增加的迁移的最新变化。
生成迁移文件:强>
rails g migration FixName
<强>#创建的db /迁移/ xxxxxxxxxx.rb 强>
修改迁移到你的旨意。
class FixName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
运行rails g migration ChangesNameInUsers
(或任何你想将它命名)
打开刚刚已经产生,并且在该方法中加入这一行(在def change
和end
之间)迁移文件:
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
保存文件,并在控制台运行rake db:migrate
检查你的schema.db
为了看这个名字已经在数据库中居然变了!
希望这有助于:)
$: rails g migration RenameHashedPasswordColumn
invoke active_record
create db/migrate/20160323054656_rename_hashed_password_column.rb
打开,移民文件,并修改该文件,如下(确实进入你原来的table_name
)
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
生成on Rails的一个Ruby迁移强>:
$:> rails g migration Fixcolumnname
插入代码在迁移文件(XXXXXfixcolumnname.rb)强>:
class Fixcolumnname < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
我们 吻.它所需要的是三个简单的步骤。以下作品 轨5.2.
1.创建一个移民
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
-这样这是完全清楚,维护者代码的基础。(使用复数形式表名)。
2.编辑的迁移
# I prefer to explicitly write the
起来and
下methods.
# ./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.运行迁移
rake db:migrate
和你的比赛!
Rails的控制台上打开你的Ruby并输入:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
你有两种方式来这样做:
在这种类型自动运行的反向编码的,它当回退。
def change rename_column :table_name, :old_column_name, :new_column_name end
这种类型,它的运行方法的时候
rake db:migrate
和运行下的方法时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
我在轨道上5.2,并试图在色器件用户重命名列。
在rename_column
位为我工作,但奇异:table_name
扔了“用户表中未找到”错误。多为我工作。
rails g RenameAgentinUser
然后改变迁移文件这样:
rename_column :users, :agent?, :agent
其中:代理?是旧列名。
只需使用命令生成迁移
rails g migration rename_hased_password
这编辑迁移附加以下在变化方法线后
rename_column :table, :hased_password, :hashed_password
这应该可以解决问题。
导轨5个迁移变化
例如:
导轨克模型学生student_name:字符串年龄:整数
如果你想改变的 student_name 作为列的名称
请注意: - 如果你不运行的轨分贝:迁移
可以以下步骤做
导轨d模型学生student_name:字符串年龄:整数
这将删除生成的迁移文件,现在你可以纠正你的列名
导轨克模型学生姓名:字符串年龄:整数
如果您迁移(导轨分贝:迁移),以下选项来改变列名
导轨克迁移RemoveStudentNameFromStudent student_name:字符串
导轨克迁移AddNameToStudent名:字符串
<强>更新强> - CREATE_TABLE的近亲是change_table,用于改变现有的表。它以类似的方式用于CREATE_TABLE但屈服于块中的对象知道更多的花样。例如:
class ChangeBadColumnNames < ActiveRecord::Migration
def change
change_table :your_table_name do |t|
t.rename :old_column_name, :new_column_name
end
end
end
本方法是更有效的,如果我们不与其他的alter方法如:删除/添加索引/删除索引/ add列,例如,我们可以进一步做这样的:
# 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
#...