如何使用 Rails 迁移删除列

How to drop columns using Rails migration

提问人:Ethan 提问时间:5/14/2010 最后编辑:NoDataDumpNoContributionEthan 更新时间:10/3/2022 访问量:507115

问:

通过 Rails 迁移删除数据库表列的语法是什么?

Ruby-on-Rails Ruby 数据库 ActiveRecord Rails-Migrations

评论


答:

14赞 Jordan Running 5/14/2010 #1

您可以尝试以下操作:

remove_column :table_name, :column_name

(官方文档)

1059赞 Nick Hammond 6/3/2010 #2
remove_column :table_name, :column_name

例如:

remove_column :users, :hobby

将从 users 表中删除 hobby Column。

评论

8赞 Powers 10/7/2013
@XåpplI'-I0llwlg'I-感谢您的评论。change 方法可用于在 Rails 4 应用程序中删除列,但不应在 Rails 3 中使用。我相应地更新了我的答案。
9赞 Nicolas 1/24/2014
您也可以在方法中使用,因为如果指定类型,则可以还原迁移。来自文档:如果存在 typeoptions 参数,将忽略这些参数。在迁移的更改方法中提供这些内容会很有帮助,以便可以还原它。在这种情况下,add_column将使用类型选项remove_column :table_name, :column_name, :type, :optionschange
29赞 Dennis 3/26/2014
在 Rails4 中,您可以删除方法中的列,但前提是您指定了列类型。例如。否则,在尝试运行迁移时,将收到以下错误:changeremove_column, :table_name, :column_name, :column_typeremove_column is only reversible if given a type
6赞 sameers 11/26/2014
在主要答案中可能值得注意的是,删除列不会删除相应的索引(如果存在)
411赞 prabu 9/19/2010 #3

对于旧版本的 Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

对于 Rails 3 及更高版本

rails generate migration RemoveFieldNameFromTableName field_name:datatype

评论

21赞 Noz 9/14/2012
“rails g” 可以用作 “rails generate” 的替代品
47赞 Stuart Nelson 11/1/2012
rails g migration remove_field_name_from_table_name field_name:datatype也有效
7赞 Claudio Floreani 4/21/2013
另请注意,后面可能跟着一个 filed_name:data_type 的空白列表,并且将创建相应的 add_column 和 remove_column 语句: 使用单个迁移删除两个属性。另请注意,方法不支持该方法,因此您必须同时编写 和 。AddXXXtoTTTRemoveXXXFromTTTrails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerremove_columnchangeupdown
3赞 Unknown_Guy 9/27/2013
Rails 4 似乎支持这一点。回滚按预期工作。change
2赞 RFVoltolini 5/23/2017
@AdamGrant我认为,如果您使用可以还原*的方法,则需要通知数据类型(以及所有其他字段修饰符),因此,如果您回滚该迁移,则可以正确重新创建该字段。* 当我说还原时,那是在数据库结构方面,当然,该列中的数据显然会丢失。change
10赞 eden 4/6/2013 #4
rails g migration RemoveXColumnFromY column_name:data_type

X = 列名 Y = 表名

编辑

更改为 as per comments - 更清楚地了解迁移的实际操作。RemoveXColumnToYRemoveXColumnFromY

评论

3赞 Sebastian vom Meer 10/22/2013
“删除列表”听起来很奇怪,所以 from 似乎是更好的选择。
0赞 BenKoshy 3/23/2016
@SebastianvomMeer 是的,我同意 - 英语读起来“from”要好得多
129赞 Powers 7/23/2013 #5

Rails 4 已经更新,因此可以在迁移中使用 change 方法来删除列,迁移将成功回滚。请阅读以下针对 Rails 3 应用程序的警告:

Rails 3 警告

请注意,使用此命令时:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

生成的迁移将如下所示:

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

在从数据库表中删除列时,请确保不要使用 change 方法(例如,在 Rails 3 应用中的迁移文件中,您不希望使用任何方法):

  def change
    remove_column :table_name, :field_name
  end

Rails 3 中的 change 方法在remove_column方面并不智能,因此您将无法回滚此迁移。

评论

4赞 roxdurazo 11/25/2015
然后运行 rake db:migrate
1赞 BenKoshy 3/22/2016
@Powers - 精彩而清晰的答案 - 你能详细说明以下内容吗:“Rails 3 中的更改方法在remove_column方面并不聪明,所以你将无法回滚这个迁移。
1赞 Powers 3/23/2016
@BKSpurgeon - 在 Rails 3 中,如果你使用该方法,那么命令将出错。 基本上是 的反面。此错误已在 Rails 4 中修复:)changerake db:rollbackrake db:rollbackrake db:migrate
2赞 rmcsharry 5/16/2016
在 Rails 4 中,我尝试回滚更改删除列。它失败并声明您必须指定data_type(如答案中的向下代码所示)
1赞 M. Habib 11/13/2017
我遇到了同样的问题,就像@rmcsharry一样。我的 rails 版本是 4.2.2,我使用了更改方法。当我尝试回滚时,发生了错误,即只有在给定类型时remove_column才可逆的。
5赞 prash 2/12/2014 #6

给出以下命令,它将自行添加到迁移文件中

rails g migration RemoveColumnFromModel

运行上述命令后,您可以检查迁移文件remove_column代码必须自行添加到其中

然后迁移数据库

rake db:migrate
43赞 superluminary 4/9/2014 #7

有两种很好的方法可以做到这一点:

remove_column

您可以简单地使用remove_column,如下所示:

remove_column :users, :first_name

如果只需要对架构进行一次更改,这很好。

change_table块

您也可以使用change_table块执行此操作,如下所示:

change_table :users do |t|
  t.remove :first_name
end

我更喜欢这个,因为我发现它更清晰,而且您可以一次进行多项更改。

以下是支持的 change_table 方法的完整列表:

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table

46赞 Lars Schirrmeister 7/10/2014 #8

在 rails4 应用中,也可以使用 change 方法删除列。第三个参数是data_type,在可选的第四个参数中,您可以提供选项。它有点隐藏在文档的“可用转换”部分。

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end
6赞 Dharmesh Rupani 4/18/2016 #9

remove_columnin 方法将帮助您从表中删除该列。change

class RemoveColumn < ActiveRecord::Migration
  def change
    remove_column :table_name, :column_name, :data_type
  end
end

转到此链接以获取完整参考:http://guides.rubyonrails.org/active_record_migrations.html

16赞 aschmid 8/24/2016 #10

在 Rails 5 中,您可以在终端中使用以下命令:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

例如,要从表 Users 中删除列 access_level(String):

rails generate migration remove_access_level_from_users access_level:string

然后运行:

rake db:migrate
14赞 XYZ 9/30/2016 #11

删除 RAILS 5 应用的列

rails g migration Remove<Anything>From<TableName> [columnName:type]

上面的命令在目录中生成一个迁移文件。Snippet blow 是 Rails 生成器生成的从表示例中删除列之一,db/migrate

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

我还制作了一个 Rails 的快速参考指南,可以在这里找到。

1赞 Manh Cuong 3/7/2017 #12

迁移文件中的 Through

remove_column :table_name, :column_name

您可以直接在 rails 控制台中通过键入以下命令来删除列:
ActiveRecord::Base.remove_column :table_name, :column_name

6赞 Karan Bamniya 4/6/2017 #13

只需简单的 3 个步骤即可从表中删除列,如下所示:

  1. 编写此命令

rails g migration remove_column_from_table_name

在终端中运行此命令后,由此名称和时间戳 (remove_column from_table_name) 创建的 1 个文件。

然后转到此文件。

  1. 你必须写的内部文件

    remove_column :table_name, :column_name

  2. 最后转到控制台,然后做

    rake db:migrate

9赞 Koresol 8/17/2017 #14

若要从表中删除列,必须运行以下迁移:

rails g migration remove_column_name_from_table_name column_name:data_type

然后运行命令:

rake db:migrate
20赞 Imran Ahmad 11/15/2017 #15

生成迁移以删除列,以便在迁移时删除该列 (),它应删除该列。如果此迁移被回滚,它应该添加回列()。rake db:migraterake db:rollback

语法:

remove_column :table_name, :column_name, :type

删除列,如果迁移被回滚,也会添加回列

例:

remove_column :users, :last_name, :string

注意如果跳过data_type,迁移将成功删除该列,但如果回滚迁移,则会引发错误。

1赞 Nuttapon 9/11/2018 #16

像这样做;

rails g migration RemoveColumnNameFromTables column_name:type

rails g migration RemoveTitleFromPosts title:string

无论如何,最好也考虑停机时间,因为 ActiveRecord 在运行时缓存数据库列,因此如果您删除列,可能会导致异常,直到您的应用程序重新启动。

参考:强迁移

2赞 Foram 1/4/2019 #17

简单地说,您可以删除列

remove_column :table_name, :column_name

例如

remove_column :posts, :comment
35赞 BenKoshy 1/22/2019 #18

Rails 5 和 6 的清晰简单说明

  • 警告:您将丢失数据
  • 警告:以下说明适用于琐碎的迁移。对于包含数百万行、读/写数据库、集群等的复杂迁移,此建议不适合您:

1. 创建迁移

在终端中运行以下命令:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype(按照惯例,表名为复数形式。请参阅此处的文档。 )

例: rails g migration RemoveAcceptedFromQuotes accepted:boolean

2. 检查迁移

# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
  # with rails 5.2 you don't need to add a separate "up" and "down" method.
  def change
    remove_column :quotes, :accepted, :boolean
  end
end

3. 运行迁移

rake db:migrate或者(它们都是一样的)rails db:migrate

....然后你就可以开始比赛了!

评论

1赞 Imran Ali 2/11/2020
现在,迁移也可以作为rails db:migrate
5赞 tenzin dorjee 8/26/2019 #19

这是 rails 控制台中的另一个

ActiveRecord::Migration.remove_column(:table_name, :column_name)

2赞 Javad Moradi 1/13/2020 #20

首先尝试运行以下命令创建迁移文件:

rails g migration RemoveAgeFromUsers age:string

然后在项目的根目录上运行以下命令的迁移:

rails db:migrate
2赞 Fernando Correia 5/9/2021 #21
  1. 在模型中将列标记为忽略
class MyModel < ApplicationRecord
  self.ignored_columns = ["my_field"]
end
  1. 生成迁移
$ bin/rails g migration DropMyFieldFromMyModel
  1. 编辑迁移
class DropMyFieldFromMyModel < ActiveRecord::Migration[6.1]
  def change
    safety_assured { remove_column :my_table, :my_field }
  end
end
  1. 运行迁移
$ bin/rails db:migrate
-1赞 Rahul Agarwal 8/11/2021 #22

只需在 rails 控制台中运行它

ActiveRecord::Base.connection.remove_column("table_name", :column_name, :its_data_type)

TableName.find_by_sql(“ALTER TABLE table_name DROP column_name”)

评论

0赞 Paul Danelli 12/17/2021
我来自未来,这是与您的数据库交互的一种糟糕方式。
0赞 Jin Lim 9/13/2022
为什么?这不推荐吗?如果你想在 Rails Controller 中做一些事情怎么办?
5赞 Hà Tiến Đạt 10/28/2021 #23

步骤 1:创建迁移

  rails g migration remove_column_name_from_table

第 2 步:在刚刚创建的文件迁移中更改代码

Rails 版本 < 3

  def change
    remove_column :table_name, :column_name, :datatype
  end

Rails 版本 >= 3

  def change
    remove_column :table_name, :column_name
  end

第 3 步:迁移

rake db:migrate

评论

0赞 fguillen 1/15/2022
简单明了
0赞 Waleed badar 8/1/2022 #24

您可以使用 Rails 迁移命令

rails generate migration RemoveColumnNameFromTableName column_name:column_type

比您可以迁移数据库:

rails db:migrate