如何使用Rails迁移删除列

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

479664 次浏览

您可以尝试以下操作:

remove_column :table_name, :column_name

官方留档

remove_column :table_name, :column_name

例如:

remove_column :users, :hobby

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

对于旧版本的Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Rails 3及以上

rails generate migration RemoveFieldNameFromTableName field_name:datatype
rails g migration RemoveXColumnFromY column_name:data_type

X=列名
Y=表名

编辑

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

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中的更改方法在remove_column方面并不智能,因此您将无法回滚此迁移。

给下面的命令它会自己添加迁移文件

rails g migration RemoveColumnFromModel

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

然后迁移数据库

rake db:migrate

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

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

在铁路4应用程序中,也可以使用change方法来删除列。第三个参数是data_type,在可选的第四个中,您可以提供选项。它有点隐藏在留档的可用转换部分。

class RemoveFieldFromTableName < ActiveRecord::Migration
def change
remove_column :table_name, :field_name, :data_type, {}
end
end

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

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

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

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

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

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

rails generate migration remove_access_level_from_users access_level:string

然后运行:

rake db:migrate

删除RAILS 5应用程序的列

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

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

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

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

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

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

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

  1. 编写此命令

rails g migration remove_column_from_table_name

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

然后转到此文件。

  1. 您必须写入的内部文件

    remove_column :table_name, :column_name

  2. 最后转到控制台,然后执行

    rake db:migrate

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

rails g migration remove_column_name_from_table_name column_name:data_type

然后运行命令:

rake db:migrate

生成迁移以删除列,如果迁移(rake db:migrate),则应删除列。如果此迁移被回滚(rake db:rollback),则应添加列回

语法:

remove_column:table_name,:column_name,: type

删除列,如果迁移是回滚的,也删除添加列回

示例:

remove_column :users, :last_name, :string

说明如果你跳过data_type,迁移将成功删除列,但如果回滚迁移,它将抛出错误。

像这样做;

rails g migration RemoveColumnNameFromTables column_name:type

rails g migration RemoveTitleFromPosts title:string

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

参考:强大的迁移

简单地说,您可以删除列

remove_column :table_name, :column_name

举个例子,

remove_column :posts, :comment

清晰简单的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:migraterails db:migrate(它们是相同的)

……然后你就可以去比赛了!

这里还有一个来自rails控制台

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

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

rails g migration RemoveAgeFromUsers age:string

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

rails db:migrate
  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

在rails控制台中运行这个

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

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

步骤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

您可以使用rails迁移命令

rails generate migration RemoveColumnNameFromTableName column_name:column_type

您可以迁移数据库:

rails db:migrate