关于ruby:如何使用Rails迁移删除列

How to drop columns using Rails migration

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


1
remove_column :table_name, :column_name

例如:

1
remove_column :users, :hobby

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


对于旧版本的Rails

1
ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

对于Rails 3及以上版本

1
rails generate migration RemoveFieldNameFromTableName field_name:datatype


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

Rails 3警告

请注意,使用此命令时:

1
rails generate migration RemoveFieldNameFromTableName field_name:datatype

生成的迁移将如下所示:

1
2
3
4
5
6
7
  def up
    remove_column :table_name, :field_name
  end

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

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

1
2
3
  def change
    remove_column :table_name, :field_name
  end

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


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

1
2
3
4
5
class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

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

remove_column

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

1
remove_column :users, :first_name

如果您只需要对模式进行一次更改,那么这很好。

change_table块

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

1
2
3
change_table :users do |t|
  t.remove :first_name
end

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

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

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


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

1
rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

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

1
rails generate migration remove_access_level_from_users access_level:string

然后运行:

1
rake db:migrate


删除RAILS 5应用程序的列

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

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

1
2
3
4
5
6
7
8
class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

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


您可以尝试以下方法:

1
remove_column :table_name, :column_name

(官方文件)


1
rails g migration RemoveXColumnFromY column_name:data_type

X =列名
Y =表名

编辑

根据评论将RemoveXColumnToY更改为RemoveXColumnFromY - 为迁移实际执行的操作提供了更清晰的信息。


清除&amp; Rails的简单说明5.2

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

1.创建迁移

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

rails generate migration remove_fieldname_from_tablename fieldname:string

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

例:

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

rails g migration RemoveAcceptedFromQuotes accepted:boolean

  • 请参阅文档re:向表中添加/删除字段时的约定:

There is a special syntactic shortcut to generate migrations that add
fields to a table.

rails generate migration add_fieldname_to_tablename fieldname:string

2.检查迁移

1
2
3
4
5
6
7
# 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.运行迁移

<5233>

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


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

语法:

remove_column:table_name,:column_name,:type

Removes column, also adds column back if migration is rollbacked.

例:

1
remove_column :users, :last_name, :string

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


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

1
rails g migration remove_column_name_from_table_name column_name:data_type

然后运行命令:

1
rake db:migrate

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

  • 写这个命令
  • rails g migration remove_column_from_table_name

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

    然后转到此文件。

  • 你要编写的内部文件

    remove_column :table_name, :column_name

  • 最后去控制台,然后做

    rake db:migrate


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

    1
    rails g migration RemoveColumnFromModel

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

    然后迁移数据库

    1
    rake db:migrate

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

    1
    2
    3
    4
    5
    class RemoveColumn < ActiveRecord::Migration
      def change
        remove_column :table_name, :column_name, :data_type
      end
    end

    请访问此链接以获取完整参考:http://guides.rubyonrails.org/active_record_migrations.html


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

    您可以通过键入以下内容直接在rails控制台中删除列:
    <5233>


    这样做;

    rails g migration RemoveColumnNameFromTables column_name:type

    rails g migration RemoveTitleFromPosts title:string

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

    参考:强大的迁移


    简单地说,您可以删除列

    1
    remove_column :table_name, :column_name

    例如,

    1
    remove_column :posts, :comment