首页 文章

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

提问于
浏览
1328

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

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

25 回答

  • 13

    只需使用命令生成迁移

    rails g migration rename_hased_password
    

    在编辑之后,迁移在change方法中添加以下行

    rename_column :table, :hased_password, :hashed_password
    

    这应该可以解决问题 .

  • -1

    Generate a Ruby on Rails migration

    $:> rails g migration Fixcolumnname
    

    Insert code in the migration file (XXXXXfixcolumnname.rb)

    class Fixcolumnname < ActiveRecord::Migration
      def change
        rename_column :table_name, :old_column, :new_column
      end
    end
    
  • 1

    我在rails 5.2上,并试图在设备用户上重命名列 .

    rename_column 位对我有用,但单数 :table_name 引发了"User table not found"错误 . 多元为我工作 .

    rails g RenameAgentinUser
    

    然后将迁移文件更改为:

    rename_column :users, :agent?, :agent
    

    哪里:代理?是旧的列名称 .

  • 10

    Generate the migration file:

    rails g migration FixName
    

    # Creates db/migrate/xxxxxxxxxx.rb

    Edit the migration to do your will.

    class FixName < ActiveRecord::Migration
      def change
        rename_column :table_name, :old_column, :new_column
      end
    end
    
  • 2

    您有两种方法可以做到这一点:

    • 在此类型中,它在回滚时自动运行它的反向代码 .
    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
    • 对于这种类型,它在 rake db:migrate 时运行up方法并在 rake db:rollback 时运行down方法:
    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
    
  • 4

    http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

    根据 Available Transformations

    rename_column(table_name, column_name, new_column_name):

    重命名列但保留类型和内容 .

  • 0

    Rails 5迁移更改

    例如:

    rails g model Student student_name:字符串年龄:整数

    如果你想将 student_name 列更改为 name

    注意: - 如果你没有运行 rails db:migrate

    您可以执行以下步骤

    rails d model Student student_name:字符串年龄:整数

    这将删除生成的迁移文件,现在您可以更正列名称

    rails g model学生姓名:字符串年龄:整数

    如果迁移(rails db:migrate),请使用以下选项更改列名

    rails g migration RemoveStudentNameFromStudent student_name:string rails g migration AddNameToStudent name:string

  • 0

    来自API:

    rename_column(table_name, column_name, new_column_name)
    

    它重命名列但保持类型和内容保持不变 .

  • 2137

    如果您的代码未与其他代码共享,那么最好的选择就是 rake db:rollback 然后在迁移中编辑您的列名称 rake db:migrate . 而已

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

    def change
        rename_column :table_name, :old_name, :new_name
      end
    

    而已 .

  • 4

    作为替代选择,如果您没有与迁移的想法结合,那么ActiveRecord有一个引人注目的宝石,它将自动为您处理名称更改,Datamapper样式 . 您所做的只是更改模型中的列名称(并确保将 Model.auto_upgrade! 放在model.rb的底部)和中提琴!数据库即时更新 .

    https://github.com/DAddYE/mini_record

    注意:您需要核实 db/schema.rb 以防止冲突

    仍然处于测试阶段,显然不适合所有人,但仍然是一个引人注目的选择(我目前在两个非平凡的 生产环境 应用程序中使用它没有问题)

  • 3

    我们可以手动使用以下方法:

    我们可以手动编辑迁移,如:

    • 打开 app/db/migrate/xxxxxxxxx_migration_file.rb

    • 更新 hased_passwordhashed_password

    • 运行以下命令

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

    然后它将删除您的迁移:

    $> rake db:migrate:up VERSION=xxxxxxxxx
    

    它将使用更新的更改添加您的迁移 .

  • 24

    运行 rails g migration ChangesNameInUsers (或任何你想要的名字)

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

    rename_column :table_name, :the_name_you_want_to_change, :the_new_name

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

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

    希望这可以帮助 :)

  • 67

    对于Ruby on Rails 4:

    def change
        rename_column :table_name, :column_name_old, :column_name_new
    end
    
  • 16

    如果该列已经填充了数据并且正在 生产环境 中,我建议采用一步一步的方法,以避免在等待迁移时停止 生产环境 .

    首先,我创建一个db迁移来添加具有新名称的列,并使用旧列名中的值填充它们 .

    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 .

    我意识到这涉及到一个过程,但我更愿意这样做,而不是 生产环境 迁移的问题 .

  • 12
    $:  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
    
  • 6

    打开Ruby on Rails控制台并输入:

    ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
    
  • 6

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

    rails g migration ChangeHasedPasswordToHashedPassword
    

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

    class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
      def change
         rename_column :table_name, :hased_password, :hashed_password
      end
    end
    
  • 6
    def change
        rename_column :table_name, :old_column_name, :new_column_name
      end
    
  • 5
    rename_column :table, :old_column, :new_column
    

    Update:

    您可能希望创建单独的迁移来执行此操作 . (重命名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
    

    An update for Rails 3.1

    虽然, updown 方法仍然适用 . Rails 3.1收到一个 change 方法"knows how to migrate your database and reverse it when the migration is rolled back without the need to write a separate down method"

    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 或者你开始做生意 .


    An update for Rails 4

    在创建 Migration 和重命名列时,Rails 4生成 change 方法而不是 updown ,如上面的答案中所述 . 生成的 change 方法如下:

    $ > rails g migration ChangeColumnName
    

    这将创建一个类似于此的迁移文件:

    class ChangeColumnName < ActiveRecord::Migration
      def change
        rename_column :table_name, :old_column, :new_column
      end
    end
    
  • 4

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

    rename_column :your_table_name, :hased_password, :hashed_password
    
  • 3

    IMO,在这种情况下,更好地使用 rake db:rollback . 然后编辑您的迁移并再次输入 rake db:migrate . 但是,如果列中有数据,则不想丢失,请使用 rename_column .

  • 2

    如果需要切换列名,则需要创建占位符以避免 duplicate column name error . 这是一个例子:

    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
    
  • 26

    Update - 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方法,例如:remove / add index / remove index / add column,这种方式会更有效,例如我们可以做更多的事情:

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

    某些版本的Ruby on Rails支持向上/向下迁移方法,如果在迁移中有up / down方法,则:

    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 - MigrationsActive Record Migrations .

  • 8

    如果当前数据对您不重要,您可以使用以下命令删除原始迁移:

    rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
    

    如果没有引号,则在原始迁移中进行更改,然后通过以下方式再次运行向上迁移:

    rake db:migrate
    

相关问题