如何使用Rails迁移删除列

Eth*_*han 600 ruby database activerecord ruby-on-rails rails-migrations

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

小智 878

remove_column :table_name, :column_name
Run Code Online (Sandbox Code Playgroud)

例如:

remove_column :users, :hobby
Run Code Online (Sandbox Code Playgroud)

将从用户表中删除业余爱好列.

  • 在Rails4中,您可以删除`change`方法中的列,但前提是您指定了列类型.例如`remove_column,:table_name,:column_name,:column_type`.否则,在尝试运行迁移时,您将收到以下错误:`remove_column只有在给定类型时才可逆 (23认同)
  • 确保在'up`和`down`方法中执行此操作,而不是`change`,如@Powers的答案中所述. (9认同)
  • 您还可以在`change`方法中使用`remove_column:table_name,:column_name,:type,:options`,因为如果指定了恢复迁移的类型,则可以进行迁移.从文档:_`type`和`options`参数如果存在将被忽略.在迁移的`change`方法中提供这些可能会有所帮助,以便可以恢复它.在这种情况下,add_column将使用`type`和`options`. (9认同)
  • @XåpplI'-I0llwlg'I-感谢您的评论.change方法可用于删除Rails 4应用程序中的列,但不应在Rails 3中使用.我相应地更新了我的答案. (6认同)
  • 在主要答案中可能值得注意的是[删除列不会删除相应的索引(如果存在)](http://stackoverflow.com/questions/7204476/will-removing-a-column-with-a-rails -migration - 删除的索引相关的与 - 的) (5认同)

pra*_*abu 364

对于旧版本的Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype
Run Code Online (Sandbox Code Playgroud)

对于Rails 3及以上版本

rails generate migration RemoveFieldNameFromTableName field_name:datatype
Run Code Online (Sandbox Code Playgroud)

  • `rails g migration remove_field_name_from_table_name field_name:datatype`也可以 (43认同)
  • "rails g"可用作"rails generate"的替代方案 (17认同)
  • 另请注意,"AddXXXtoTTT"和"RemoveXXXFromTTT"之后可能会出现白色间隔的filed_name:data_type列表,并且将创建相应的add_column和remove_column语句:`rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integer`删除两个属性使用单一迁移.另请注意,`change`方法不支持`remove_column`,所以你必须写'up`和`down`. (6认同)
  • Rails 4似乎支持`change`.回滚的工作方式应该如此. (3认同)
  • @AdamGrant我认为如果你使用的是`change`方法可以_reverted*_你需要通知数据类型(以及所有其他字段修饰符),所以如果你回滚那个迁移,那么可以正确地重新创建字段._*当我说还原时,那就是数据库结构,当然,来自该列的数据显然会丢失._ (2认同)

Pow*_*ers 116

Rails 4已更新,因此可以在迁移中使用更改方法删除列,并且迁移将成功回滚.请阅读Rails 3应用程序的以下警告:

Rails 3警告

请注意,使用此命令时:

rails generate migration RemoveFieldNameFromTableName field_name:datatype
Run Code Online (Sandbox Code Playgroud)

生成的迁移将如下所示:

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end
Run Code Online (Sandbox Code Playgroud)

从数据库表中删除列时,请确保不使用change方法(Rails 3应用程序中迁移文件中不需要的示例):

  def change
    remove_column :table_name, :field_name
  end
Run Code Online (Sandbox Code Playgroud)

当涉及remove_column时,Rails 3中的更改方法并不聪明,因此您将无法回滚此迁移.

  • 然后运行rake db:migrate (3认同)
  • 在Rails 4中,我尝试回滚更改删除列.它失败并声明您必须指定data_type(如在答案中的代码中) (2认同)

Lar*_*ter 36

在rails4应用程序中,也可以使用change方法删除列.第三个参数是data_type,在可选的第四个参数中你可以给出选项.它在文档的 "可用转换"部分中有点隐藏.

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end
Run Code Online (Sandbox Code Playgroud)


sup*_*ary 25

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

remove_column

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

remove_column :users, :first_name
Run Code Online (Sandbox Code Playgroud)

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

change_table块

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

change_table :users do |t|
  t.remove :first_name
end
Run Code Online (Sandbox Code Playgroud)

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

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

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


asc*_*mid 14

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

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE
Run Code Online (Sandbox Code Playgroud)

例如,从表用户中删除列access_level(字符串):

rails generate migration remove_access_level_from_users access_level:string
Run Code Online (Sandbox Code Playgroud)

然后运行:

rake db:migrate
Run Code Online (Sandbox Code Playgroud)


Jor*_*ing 11

您可以尝试以下方法:

remove_column :table_name, :column_name
Run Code Online (Sandbox Code Playgroud)

(官方文件)


Lor*_*lor 11

删除RAILS 5应用程序的列

rails g migration Remove<Anything>From<TableName> [columnName:type]
Run Code Online (Sandbox Code Playgroud)

上面的命令在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
Run Code Online (Sandbox Code Playgroud)

我也为Rails做了一个快速参考指南,可以在这里找到.


Imr*_*ran 11

生成迁移以删除列,如果它已迁移(rake db:migrate),则应删除该列.如果这个迁移是rollbacked(),它应该添加列rake db:rollback.

语法:

remove_column:table_name,:column_name,:type

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

例:

remove_column :users, :last_name, :string
Run Code Online (Sandbox Code Playgroud)

注意:如果跳过data_type,迁移将成功删除列,但如果您回滚迁移,则会出错.


ede*_*den 10

rails g migration RemoveXColumnFromY column_name:data_type
Run Code Online (Sandbox Code Playgroud)

X =列名
Y =表名

编辑

改变RemoveXColumnToYRemoveXColumnFromY按注释-提供什么样的迁移实际上做的更清晰.

  • "删除列**到**表"听起来很奇怪,所以来自**的**似乎是更好的选择. (3认同)

BKS*_*eon 10

Rails 5.2的简单明了说明

警告:如果从数据库中删除列,则会丢失数据。要继续,请参见以下内容:


1.创建迁移

  • 在终端中运行以下命令:

rails generate migration remove_fieldname_from_tablename fieldname:string

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

例:

  • 就我而言,我想acceptedquotes表中删除该列(一个布尔值):

rails g migration RemoveAcceptedFromQuotes accepted:boolean

有一个特殊的语法捷径可以生成将字段添加到表的迁移。

Rails生成迁移add_fieldname_to_tablename fieldname:string

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
Run Code Online (Sandbox Code Playgroud)

3.运行迁移

rake db:migrate

....然后您就可以参加比赛了!


小智 8

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

rails g migration remove_column_name_from_table_name column_name:data_type
Run Code Online (Sandbox Code Playgroud)

然后运行命令:

rake db:migrate
Run Code Online (Sandbox Code Playgroud)


小智 5

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

rails g migration RemoveColumnFromModel
Run Code Online (Sandbox Code Playgroud)

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

然后迁移数据库

rake db:migrate
Run Code Online (Sandbox Code Playgroud)


小智 5

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

class RemoveColumn < ActiveRecord::Migration
  def change
    remove_column :table_name, :column_name, :data_type
  end
end
Run Code Online (Sandbox Code Playgroud)

继续以下链接以获取完整参考:http : //guides.rubyonrails.org/active_record_migrations.html


Kar*_*iya 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


小智 5

这是 Rails 控制台的另一篇文章

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


小智 5

第 1 步:创建迁移

  rails g migration remove_column_name_from_table
Run Code Online (Sandbox Code Playgroud)

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

导轨版本 < 3

  def change
    remove_column :table_name, :column_name, :datatype
  end
Run Code Online (Sandbox Code Playgroud)

Rails 版本 >= 3

  def change
    remove_column :table_name, :column_name
  end
Run Code Online (Sandbox Code Playgroud)

第 3 步:迁移

rake db:migrate
Run Code Online (Sandbox Code Playgroud)