How can I rename a database column in a Ruby on Rails migration?
我错误地将列命名为
如何使用迁移重命名此列来更新数据库架构?
1 | rename_column :table, :old_column, :new_column |
更新:
你可能想这样做创建一个单独的迁移。(fixcolumnname重命名为你想要的)
1 2 | script/generate migration FixColumnName # creates db/migrate/xxxxxxxxxx_fix_column_name.rb |
然后你想要做的编辑位置迁移。
1 2 3 4 5 6 7 8 9 10 | # 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 |
在Rails更新3.1 for
在方法,适用于
1 2 3 4 5 6 7 | rails g migration FixColumnName class FixColumnName < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end |
如果你有一个几乎将整个列,或要求的东西会在表名称重复一遍。
1 2 3 | rename_column :table_name, :old_column1, :new_column1 rename_column :table_name, :old_column2, :new_column2 ... |
你可以使用一个小neater
1 2 3 4 5 6 7 8 9 | 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 |
谢谢你,
然后你就
在Rails更新4。
当创建一个renaming
1 | $ > rails g migration ChangeColumnName |
这将创建一个迁移文件类似于此:
1 2 3 4 5 | class ChangeColumnName < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end |
海事组织,本案例中,使用
如果一个数据populated柱已经在生产和生活,我是一步一步的方法,如以避免生产停机时间迁移而在等待。
第一,我创建了一个数据库迁移到新添加的列的名称(S)和他们的价值观从填充柱的旧名称。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 |
然后我只提交变更,改变生产和按下。
1 | git commit -m 'adding columns with correct name' |
然后一旦提交已推到生产运行,I’d。
1 | Production $ bundle exec rake db:migrate |
我会更新所有视图/控制器的名字是引用旧柱新的列的名称。我的测试套件和贯通,只是那些提交的变化。(以确保它的工作是通过局部测试第一和所有!)
1 | git commit -m 'using correct column name instead of old stinky bad column name' |
然后我推是提交到生产。
在这一点,你可以把原来担心的一种柱没有任何停机时间与迁移相关的准备。
1 2 3 4 5 6 7 8 9 10 11 | 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 |
然后推到这个最新生产和
我知道这是一个一位参与的过程,但我宁愿做一个比我的生产迁移的问题。
http:/ / / / / migration.html ActiveRecord类api.rubyonrails.org
在
但一A柱,可以扫描的类型和内容。
运行以下命令创建迁移文件:
1 | rails g migration ChangeHasedPasswordToHashedPassword |
然后在
1 2 3 4 5 | class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration def change rename_column :table_name, :hased_password, :hashed_password end end |
从API:
1 | rename_column(table_name, column_name, new_column_name) |
它可以扫描一个A柱的类型和内容,但仍然是一样的。
RubyonRails的一些版本支持向上/向下的迁移方法,如果您在迁移中有向上/向下的方法,那么:
1 2 3 4 5 6 7 | 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 |
如果您在迁移中使用了
1 2 3 | def change rename_column :table_name, :column_old_name, :column_new_name end |
有关更多信息,您可以移动:RubyonRails-迁移或活动记录迁移。
如果您的代码没有与其他代码共享,那么最好的选择是只执行
您可以编写另一个迁移来重命名列
1 2 3 | def change rename_column :table_name, :old_name, :new_name end |
就是这样。
如果你需要,你将需要交换的列名称创建一个列的名称placeholder避免重复错误。这里的例子:
1 2 3 4 5 6 7 | 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 _升级!在你的model.rb底)和中提琴!实时数据库是更新。
http:////小github.com daddye _记录
注意:您将需要核分贝/ schema.rb预防冲突
在β相的安静和不安静的人,但每个人选择A是一个正在使用它在生产应用程序和没有非平凡的问题)
如果数据是重要的你,你可以把你的原始迁移下使用:
1 | rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE' |
没有引号,然后组成变化的动原迁移和迁移:跑了。
1 | rake db:migrate |
只需创建一个新的迁移,并在一个块中使用
1 | rename_column :your_table_name, :hased_password, :hashed_password |
对于Ruby on Rails 4:
1 2 3 | def change rename_column :table_name, :column_name_old, :column_name_new end |
我们可以手动使用以下方法:
我们可以手动编辑迁移,如下所示:
打开
app/db/migrate/xxxxxxxxx_migration_file.rb 。更新
hased_password 至hashed_password 运行以下命令
1$> rake db:migrate:down VERSION=xxxxxxxxx
然后它将删除您的迁移:
1 | $> rake db:migrate:up VERSION=xxxxxxxxx |
它将使用更新的更改添加您的迁移。
生成迁移文件:
1 | rails g migration FixName |
#创建db/migrate/XXXXXXXXX.rb
编辑迁移以按您的意愿执行。
1 2 3 4 5 | class FixName < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end |
1 2 3 | $: rails g migration RenameHashedPasswordColumn invoke active_record create db/migrate/20160323054656_rename_hashed_password_column.rb |
打开迁移文件并按如下方式修改该文件(请输入原始的
1 2 3 4 5 | class RenameHashedPasswordColumn < ActiveRecord::Migration def change rename_column :table_name, :hased_password, :hashed_password end end |
运行
打开刚刚生成的迁移文件,在方法中添加此行(在
保存文件,并在控制台中运行
查看您的
希望这有帮助:)
生成Ruby on Rails迁移:
1 | $:> rails g migration Fixcolumnname |
在迁移文件(xxxxx fixcolumnname.rb)中插入代码:
1 2 3 4 5 | class Fixcolumnname < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end |
1 2 3 | def change rename_column :table_name, :old_column_name, :new_column_name end |
有两种方法可以做到这一点:
在这种类型中,当回滚时,它会自动运行它的逆向代码。
1 2 3 | def change rename_column :table_name, :old_column_name, :new_column_name end |
对于这种类型,它在
1 2 3 4 5 6 7 | 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 |
打开Ruby on Rails控制台并输入:
1 | ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column |
让我们接吻。它只需要三个简单的步骤。以下适用于Rails 5.2。
1。创建迁移rails g migration RenameNameToFullNameInStudents rails g RenameOldFieldToNewFieldInTableName —这样,以后代码库的维护者就可以很清楚地看到了。(使用复数形式表示表名)。
2。编辑迁移
1 2 3 4 5 6 7 8 9 10 11 | 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 |
三。运行迁移
你要去参加比赛了!
我在Rail5.2上,并尝试重命名一个device用户的列。
1 | rails g RenameAgentinUser |
然后将迁移文件更改为:
1 | rename_column :users, :agent?, :agent |
代理人:在哪里?是旧的列名称。
只需使用命令生成迁移
1 | rails g migration rename_hased_password |
在编辑迁移之后,在change方法中添加以下行
1 | rename_column :table, :hased_password, :hashed_password |
这样就可以了。
Rails 5迁移更改
如:
rails g model Student student_name:string age:integer
如果你想把学生姓名栏改为姓名
注意:如果不运行rails db:migrate
您可以执行以下步骤
rails d model Student student_name:string age:integer
这将删除生成的迁移文件,现在可以更正列名
rails g model Student name:string age:integer
如果已迁移(rails db:migrate),请使用以下选项更改列名
rails g migration RemoveStudentNameFromStudent student_name:string
rails g migration AddNameToStudent name:string
更新-create_table的近亲是change_table,用于更改现有表。它以类似的方式用于创建表,但是向块屈服的对象知道更多的技巧。例如:
1 2 3 4 5 6 7 | 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方法(如:remove/add index/remove index/add column),这种方法会更有效,例如,我们可以进一步执行如下操作:
1 2 3 4 5 6 7 8 9 | # 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 #... |