提问人:Ethan 提问时间:5/14/2010 最后编辑:NoDataDumpNoContributionEthan 更新时间:10/3/2022 访问量:507115
如何使用 Rails 迁移删除列
How to drop columns using Rails migration
答:
您可以尝试以下操作:
remove_column :table_name, :column_name
(官方文档)
remove_column :table_name, :column_name
例如:
remove_column :users, :hobby
将从 users 表中删除 hobby Column。
评论
如果存在 type
和 options
参数,将忽略这些参数。在迁移的更改
方法中提供这些内容会很有帮助,以便可以还原它。在这种情况下,add_column将使用类型
和选项
。remove_column :table_name, :column_name, :type, :options
change
change
remove_column, :table_name, :column_name, :column_type
remove_column is only reversible if given a type
对于旧版本的 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
rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integer
remove_column
change
up
down
change
change
rails g migration RemoveXColumnFromY column_name:data_type
X = 列名 Y = 表名
编辑
更改为 as per comments - 更清楚地了解迁移的实际操作。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 中的 change 方法在remove_column方面并不智能,因此您将无法回滚此迁移。
评论
change
rake db:rollback
rake db:rollback
rake db:migrate
给出以下命令,它将自行添加到迁移文件中
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
在 rails4 应用中,也可以使用 change 方法删除列。第三个参数是data_type,在可选的第四个参数中,您可以提供选项。它有点隐藏在文档的“可用转换”部分。
class RemoveFieldFromTableName < ActiveRecord::Migration
def change
remove_column :table_name, :field_name, :data_type, {}
end
end
remove_column
in 方法将帮助您从表中删除该列。change
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
例如,要从表 Users 中删除列 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]
上面的命令在目录中生成一个迁移文件。Snippet blow 是 Rails 生成器生成的从表示例中删除列之一,db/migrate
class RemoveAgeFromUsers < ActiveRecord::Migration
def up
remove_column :users, :age
end
def down
add_column :users, :age, :integer
end
end
我还制作了一个 Rails 的快速参考指南,可以在这里找到。
迁移文件中的 Through
remove_column :table_name, :column_name
您可以直接在 rails 控制台中通过键入以下命令来删除列:
ActiveRecord::Base.remove_column :table_name, :column_name
只需简单的 3 个步骤即可从表中删除列,如下所示:
- 编写此命令
rails g migration remove_column_from_table_name
在终端中运行此命令后,由此名称和时间戳 (remove_column from_table_name) 创建的 1 个文件。
然后转到此文件。
你必须写的内部文件
remove_column :table_name, :column_name
最后转到控制台,然后做
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
无论如何,最好也考虑停机时间,因为 ActiveRecord 在运行时缓存数据库列,因此如果您删除列,可能会导致异常,直到您的应用程序重新启动。
参考:强迁移
简单地说,您可以删除列
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:migrate
或者(它们都是一样的)rails db:migrate
....然后你就可以开始比赛了!
评论
rails db:migrate
这是 rails 控制台中的另一个
ActiveRecord::Migration.remove_column(:table_name, :column_name)
首先尝试运行以下命令创建迁移文件:
rails g migration RemoveAgeFromUsers age:string
然后在项目的根目录上运行以下命令的迁移:
rails db:migrate
- 在模型中将列标记为忽略
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”)
评论
步骤 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
评论