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

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


当前回答

我在rails 5.2上,试图重命名device User上的列。

rename_column位对我有效,但单数:table_name抛出了“User table not found”错误。Plural为我工作。

rails g RenameAgentinUser

然后将迁移文件更改为:

rename_column :users, :agent?, :agent

哪里:代理人?是旧的列名。

其他回答

这可能比重命名列、创建新列并复制内容更好:

通过这种方式,我们可以保存旧列中的内容

这可能是一代人:

rails generate migration add_birthdate_to_User birthdate:string

这可能是迁移:

class AddBirthdateToUser < ActiveRecord::Migration[7.0]
  def change
    add_column :user, :birthdate, :json, default: '[]', null: false

    reversible do |dir|
      dir.up do
        User.update_all('birthdate=birtdate') # rubocop:disable Rails/SkipsModelValidations
      end
    end
  end
end

之后,您必须删除错误的“出生日期”列

class RemoveBirthdateFromUser < ActiveRecord::Migration[7.0]
  def change
    remove_column :User, :Birtdate, :json
  end
end

在我看来,在这种情况下,最好使用rakedb:rollback,然后编辑迁移并再次运行rakedb:migrate。

但是,如果列中有不希望丢失的数据,请使用rename_column。

 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

我在使用PostgreSQL数据库开发Rails 6应用程序时遇到了这个挑战。

以下是我修复它的方法:

在我的例子中,table_name是“Products”,old_column是“SKU”,new_column则是“ProductNumber”。

创建包含用于重命名列的命令的迁移文件:rails生成迁移重命名KUToProductNumberInProducts打开db/migrate目录中的迁移文件:数据库/migrate/2021028082344_rename_sku_to_product_number_in_products.rb添加用于重命名列的命令:类RenameKuToProductNumberInProducts<ActiveRecord::迁移[6.0]def更改#重命名列:表名,:旧列,:新列重命名列:产品,:sku,:product_number终止终止保存,然后运行迁移命令:轨道数据库:移植

现在,您可以通过查看架构文件来确认列的重命名:

    db/schema.rb

如果您对列的重命名不满意,可以始终回滚:

    rails db:rollback

注意:在调用列名的所有位置,努力将列名修改为新名称。

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

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

打开app/db/migrate/xxxxx_migration_file.rb将hased_password更新为hashed_passwords运行以下命令$>rakedb:migrate:down VERSION=xxxxxxxxx

然后它将删除您的迁移:

$> rake db:migrate:up VERSION=xxxxxxxxx

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