699

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

4

23 回答 23

1017
remove_column :table_name, :column_name

例如:

remove_column :users, :hobby

将从用户表中删除爱好列。

于 2010-06-03T05:49:17.690 回答
390

对于旧版本的 Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

对于 Rails 3 及更高版本

rails generate migration RemoveFieldNameFromTableName field_name:datatype
于 2010-09-18T18:22:03.940 回答
126

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 方面并不聪明,因此您将无法回滚此迁移。

于 2013-07-22T16:12:57.517 回答
43

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

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end
于 2014-07-09T21:30:09.473 回答
37

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

删除列

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

remove_column :users, :first_name

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

更改表块

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

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

我更喜欢这个,因为我觉得它更清晰,你可以一次做几个改变。

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

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

于 2014-04-09T12:25:33.590 回答
27

Rails 5 和 6 的清晰简单说明

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

1. 创建迁移

在终端中运行以下命令:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

注意:根据 Rails 约定,表名应为复数形式。

例子:

在我的情况下,我想accepted从表中删除列(布尔值)quotes

rails g migration RemoveAcceptedFromQuotes accepted:boolean

请参阅文档重新:向表添加/删除字段时的约定:

有一个特殊的语法快捷方式可以生成向表中添加字段的迁移。

rails 生成迁移 add_fieldname_to_tablename 字段名:字段类型

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:migraterails db:migrate(它们都相同)

....然后你就去参加比赛了!

于 2019-01-22T04:36:09.423 回答
17

生成迁移以删除列,这样如果它被迁移 ( rake db:migrate),它应该删除该列。如果此迁移被回滚(),它应该重新添加列。rake db:rollback

语法:

remove_column :table_name, :column_name, :type

删除列,如果回滚迁移,还会添加列。

例子:

remove_column :users, :last_name, :string

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

于 2017-11-15T15:38:50.157 回答
16

在 rails 5 中,您可以在终端中使用此命令:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

例如从表用户中删除列 access_level(string):

rails generate migration remove_access_level_from_users access_level:string

然后运行:

rake db:migrate
于 2016-08-24T09:11:40.187 回答
12

您可以尝试以下方法:

remove_column :table_name, :column_name

官方文档

于 2010-05-14T00:04:39.973 回答
12

删除 RAILS 5 应用程序的列

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

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

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

我还为 Rails 制作了一个快速参考指南,可以在此处找到。

于 2016-09-30T06:49:08.470 回答
10
rails g migration RemoveXColumnFromY column_name:data_type

X = 列名
Y = 表名

编辑

根据评论更改RemoveXColumnToYRemoveXColumnFromY- 更清楚地了解迁移的实际操作。

于 2013-04-06T08:24:33.240 回答
9

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

rails g migration remove_column_name_from_table_name column_name:data_type

然后运行命令:

rake db:migrate
于 2017-08-17T11:15:13.177 回答
5

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

rails g migration RemoveColumnFromModel

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

然后迁移数据库

rake db:migrate
于 2014-02-12T03:06:53.510 回答
5

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

  1. 写这个命令

rails g migration remove_column_from_table_name

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

然后转到这个文件。

  1. 你必须写的内部文件

    remove_column :table_name, :column_name

  2. 最后去控制台然后做

    rake db:migrate

于 2017-04-06T09:23:44.797 回答
5

remove_columninchange方法将帮助您从表中删除列。

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

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

于 2016-04-18T00:37:29.660 回答
4

这是来自 rails 控制台的另一个

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

于 2019-08-26T08:36:11.943 回答
3

步骤 1:创建迁移

  rails g migration remove_column_name_from_table

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

导轨版本 < 3

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

导轨版本 >= 3

  def change
    remove_column :table_name, :column_name
  end

第 3 步:迁移

rake db:migrate
于 2021-10-28T09:47:25.533 回答
2

首先尝试创建一个运行命令的迁移文件:

rails g migration RemoveAgeFromUsers age:string

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

rails db:migrate
于 2020-01-13T05:31:52.713 回答
2

简单地说,您可以删除列

remove_column :table_name, :column_name

例如,

remove_column :posts, :comment
于 2019-01-04T06:16:01.523 回答
1
  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
于 2021-05-08T21:14:43.053 回答
1

通过
remove_column :table_name, :column_name
在迁移文件中

您可以通过键入以下内容直接在 Rails 控制台中删除列:
ActiveRecord::Base.remove_column :table_name, :column_name

于 2017-03-06T18:08:07.613 回答
1

这样做;

rails g migration RemoveColumnNameFromTables column_name:type

IErails g migration RemoveTitleFromPosts title:string

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

参考:强迁移

于 2018-09-11T07:08:07.180 回答
-1

只需在 Rails 控制台中运行它

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

或者

TableName.find_by_sql(“ALTER TABLE table_name DROP column_name”)
于 2021-08-11T12:03:54.853 回答