如何在Ruby on Rails迁移中重命名数据库列?

How can I rename a database column in a Ruby on Rails migration?

我错误地将列命名为hased_password,而不是hashed_password

如何使用迁移重命名此列来更新数据库架构?


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

在方法,适用于downup和安静。Rails是一change3.1法——"知道如何migrate数据库和它的逆当于反向迁移是不需要写一个单独的升降法"

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 change_table保持的东西。

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

谢谢你,Luke&;&;Turadg,把上的主题。

然后你就db:migrate照旧不去或是您的业务。

在Rails更新4。

当创建一个renaming Migrationfor a column change哪里Rails 4 A和AS法代替updown在上面提到的答案。方法是为产生的change在下面:

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


海事组织,本案例中,使用rake db:rollback更好。然后编辑您的学院式rake db:migrate迁移。然而,如果你的数据在列的你不想松散,然后用rename_column


如果一个数据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

然后推到这个最新生产和bundle exec rake db:migrate迁移运行中的背景。

我知道这是一个一位参与的过程,但我宁愿做一个比我的生产迁移的问题。


http:/ / / / / migration.html ActiveRecord类api.rubyonrails.org

Available Transformations

rename_column(table_name, column_name, new_column_name):

但一A柱,可以扫描的类型和内容。


运行以下命令创建迁移文件:

1
rails g migration ChangeHasedPasswordToHashedPassword

然后在db/migrate文件夹中生成的文件中,写入rename_column如下:

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

如果您在迁移中使用了change方法,那么:

1
2
3
def change
    rename_column :table_name, :column_old_name, :column_new_name
end

有关更多信息,您可以移动:RubyonRails-迁移或活动记录迁移。


如果您的代码没有与其他代码共享,那么最好的选择是只执行rake db:rollback。然后在migration和rake db:migrate中编辑列名称。就是这样

您可以编写另一个迁移来重命名列

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

只需创建一个新的迁移,并在一个块中使用rename_column,如下所示。

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_passwordhashed_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

打开迁移文件并按如下方式修改该文件(请输入原始的table_name)

1
2
3
4
5
class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end

运行rails g migration ChangesNameInUsers(或任何您想命名的名称)

打开刚刚生成的迁移文件,在方法中添加此行(在def changeend之间):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

保存文件,并在控制台中运行rake db:migrate

查看您的schema.db以查看数据库中的名称是否实际发生了更改!

希望这有帮助:)


生成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
  • 对于这种类型,它在rake db:migrate时运行up方法,在rake db:rollback时运行down方法:

    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。编辑迁移

    # I prefer to explicitly write theandmethods.

    # ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb

    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

    三。运行迁移

    rake db:migrate

    你要去参加比赛了!


    我在Rail5.2上,并尝试重命名一个device用户的列。

    rename_column位对我有用,但是单个:table_name抛出了一个"找不到用户表"错误。复数对我有用。

    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
    #...