通过 Rails migration 删除数据库表列的语法是什么?
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 remove_field_name_from_table_name field_name:datatype
也有效
AddXXXtoTTT
和 RemoveXXXFromTTT
后面可能跟有一个由空格分隔的字段名称:数据类型列表,并且将创建相应的 add_column 和 remove_column 语句:rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integer
使用单个迁移删除两个属性。另请注意,change
方法不支持 remove_column
,因此您必须同时编写 up
和 down
。
change
。回滚工作正常。
change
方法,您需要通知数据类型(以及所有其他字段修饰符),因此如果您回滚该迁移,该字段可以正确重新创建。 * 当我说reverted时,那是在数据库结构方面,当然,该列中的数据显然会丢失。
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 方面并不聪明,因此您将无法回滚此迁移。
change
方法,则 rake db:rollback
命令将出错。 rake db:rollback
基本上与 rake db:migrate
相反。此错误已在 Rails 4 中修复 :)
在 rails4 应用程序中,也可以使用 change 方法来删除列。第三个参数是 data_type 并且在可选的第四个中您可以提供选项。它有点隐藏在 the documentation 上的“可用转换”部分中。
class RemoveFieldFromTableName < ActiveRecord::Migration
def change
remove_column :table_name, :field_name, :data_type, {}
end
end
有两种好方法可以做到这一点:
删除列
您可以简单地使用 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
Rails 5 和 6 的清晰简单说明
警告:您将丢失数据。
警告:以下说明适用于简单的迁移。对于具有数百万行、读/写数据库、集群的复杂迁移,此建议不适合您:
1. 创建迁移
在终端中运行以下命令:
rails generate migration remove_fieldname_from_tablename fieldname:fieldtype
(表名复数,按照惯例。See the documentation here.)
示例: 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
(它们都相同)
....然后你就去参加比赛了!
rails db:migrate
运行
生成迁移以移除列,这样如果它被迁移 (rake db:migrate
),它应该删除该列。如果此迁移被回滚 (rake db:rollback
),它应该添加列。
语法:
remove_column :table_name, :column_name, :type
删除列,如果回滚迁移,还会添加列。
例子:
remove_column :users, :last_name, :string
注意:如果您跳过 data_type,迁移将成功删除该列,但如果您回滚迁移,则会引发错误。
在 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
删除 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 制作了一个快速参考指南,可以在 here 找到。
rails g migration RemoveXColumnFromY column_name:data_type
X = 列名 Y = 表名
编辑
根据评论将 RemoveXColumnToY
更改为 RemoveXColumnFromY
- 更清楚地了解迁移的实际操作。
要从表中删除列,您必须运行以下迁移:
rails g migration remove_column_name_from_table_name column_name:data_type
然后运行命令:
rake db:migrate
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 g migration RemoveColumnFromModel
运行上述命令后,您可以检查迁移文件 remove_column 代码是否必须自行添加
然后迁移数据库
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
这是来自 rails 控制台的另一个
ActiveRecord::Migration.remove_column(:table_name, :column_name)
步骤 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
简单地说,您可以删除列
remove_column :table_name, :column_name
例如,
remove_column :posts, :comment
首先尝试创建一个运行命令的迁移文件:
rails g migration RemoveAgeFromUsers age:string
然后在项目的根目录上运行运行命令的迁移:
rails db:migrate
通过
remove_column :table_name, :column_name
在迁移文件中
您可以通过键入以下内容直接在 Rails 控制台中删除列:
ActiveRecord::Base.remove_column :table_name, :column_name
这样做;
rails g migration RemoveColumnNameFromTables column_name:type
即rails g migration RemoveTitleFromPosts title:string
无论如何,最好考虑停机时间,因为 ActiveRecord 在运行时缓存数据库列,所以如果你删除一个列,它可能会导致异常,直到你的应用程序重新启动。
在模型中将该列标记为忽略
class MyModel < ApplicationRecord
self.ignored_columns = ["my_field"]
end
生成迁移
$ bin/rails g migration DropMyFieldFromMyModel
编辑迁移
class DropMyFieldFromMyModel < ActiveRecord::Migration[6.1]
def change
safety_assured { remove_column :my_table, :my_field }
end
end
运行迁移
$ 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”)
up
和down
方法中执行此操作,而不是change
,正如@Powers 的回答中所解释的那样。change
方法中使用remove_column :table_name, :column_name, :type, :options
,因为如果您指定类型,则可以恢复迁移。从文档中:如果存在,将忽略type
和options
参数。在迁移的change
方法中提供这些可能会有所帮助,以便可以将其还原。在这种情况下,add_column 将使用type
和options
。change
方法中删除列,但前提是您指定了列类型。例如remove_column, :table_name, :column_name, :column_type
。否则,您在尝试运行迁移时会收到以下错误:remove_column is only reversible if given a type