通过Rails迁移删除数据库表列的语法是什么?
答案 0 :(得分:830)
remove_column :table_name, :column_name
例如:
remove_column :users, :hobby
将从用户表中删除爱好列。
答案 1 :(得分:354)
对于旧版本的Rails
ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype
对于Rails 3及以上
rails generate migration RemoveFieldNameFromTableName field_name:datatype
答案 2 :(得分:112)
Rails 4已更新,因此可以在迁移中使用更改方法删除列,并且迁移将成功回滚。请阅读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
对于remove_column,Rails 3中的更改方法并不聪明,因此您将无法回滚此迁移。
答案 3 :(得分:35)
在rails4应用程序中,也可以使用change方法删除列。第三个参数是data_type,在可选的第四个参数中你可以给出选项。它隐藏在the documentation上的“可用转换”部分。
class RemoveFieldFromTableName < ActiveRecord::Migration
def change
remove_column :table_name, :field_name, :data_type, {}
end
end
答案 4 :(得分:22)
有两种好方法可以做到这一点:
你可以简单地使用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
答案 5 :(得分:13)
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
答案 6 :(得分:11)
删除RAILS 5 App的列
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找到。
答案 7 :(得分:10)
rails g migration RemoveXColumnFromY column_name:data_type
X =列名称
Y =表名
修改强>
根据评论将RemoveXColumnToY
更改为RemoveXColumnFromY
- 为迁移实际执行的操作提供了更清晰的信息。
答案 8 :(得分:10)
答案 9 :(得分:7)
要从表中删除列,您必须在迁移后运行:
var express = require('express');
var mysql = require('mysql');
var path = require('path');
var async = require('async')
var app = express();
var connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "123456",
database: "myDB"
})
app.set('port', 3001);
var questions = [];
var question_ids = [];
var answers = [];
var answer_ids = []
app.get('/training/:user_type', function (req, res) {
var user_type = req.params.user_type // gets the value for the named parameter user_id from the url
var sql_command_1 = "SELECT * FROM questions WHERE type = ?"
var sql_command_2 = "SELECT * FROM answers WHERE question_id = ?"
function getQuestions() {
return new Promise((resolve, reject) => {
connection.query(sql_command_1, user_type, function (error, results) {
for (i = 0; i < results.length; i++) {
questions.push(results[i].question_text);
question_ids.push(results[i].question_id);
}
resolve({questions: questions, question_ids: question_ids});
})
})
}
function getAnswers(question_ids) {
console.log(question_ids)
return new Promise((resolve, reject) => {
for (i = 0; i < question_ids.length; i++) {
connection.query(sql_command_2, question_ids[i], function (error, results) {
for (i = 0; i < results.length; i++) {
answers.push(results[i].answer_text);
answer_ids.push(results[i].answer_id);
}
console.log(answers);
console.log(answer_ids);
resolve({answers: answers, answer_ids: answer_ids});
});
}
});
}
getQuestions().then((result) => {
console.log(result);
return getAnswers(result.question_ids);
}).then((result) => {
res.json({"Type": user_type, "Questions": questions, "Answers": answers});
});
});
app.listen(app.get('port'));
然后运行命令:
rails g migration remove_column_name_from_table_name column_name:data_type
答案 10 :(得分:7)
生成迁移以删除列,以便在迁移(rake db:migrate
)时,删除列。如果此次迁移已回滚(rake db:rollback
),则应添加列。
语法:
remove_column:table_name,:column_name,:type
删除列,如果迁移回滚,添加列。
示例:
remove_column :users, :last_name, :string
注意:如果您跳过data_type ,迁移将成功删除列,但如果您回滚迁移,则会出错。
答案 11 :(得分:6)
警告:如果从数据库中删除列,则会丢失数据。要继续,请参见下文:
rails generate migration remove_fieldname_from_tablename fieldname:string
示例:
accepted
表中删除quotes
列(一个布尔值): rails g migration RemoveAcceptedFromQuotes accepted:boolean
有一个特殊的语法捷径可以生成添加 表中的字段。
rails生成迁移add_fieldname_to_tablename fieldname:string
# 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
rake db:migrate
...。然后您就可以参加比赛了!
答案 12 :(得分:5)
给出以下命令,它将在自己的
中添加迁移文件rails g migration RemoveColumnFromModel
运行上述命令后,您可以检查迁移文件remove_column代码必须自己添加
然后迁移db
rake db:migrate
答案 13 :(得分:5)
remove_column
方法中的 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
答案 14 :(得分:5)
只需简单的3个步骤即可从表中删除列,如下所示:
rails g migration remove_column_from_table_name
在通过此名称和时间戳创建的终端文件中运行此命令后(remove_column from_table_name)。
然后转到此文件。
你必须写的文件
remove_column :table_name, :column_name
最后转到控制台,然后执行
rake db:migrate
答案 15 :(得分:1)
通过
remove_column :table_name, :column_name
在迁移文件中
您可以通过键入以下内容直接在rails控制台中删除列:
ActiveRecord::Base.remove_column :table_name, :column_name
答案 16 :(得分:1)
首先尝试创建一个运行命令的迁移文件:
rails g migration RemoveAgeFromUsers age:string
,然后在项目的根目录上运行迁移,并运行以下命令:
rails db:migrate
答案 17 :(得分:1)
在Rails控制台上再添加一个
ActiveRecord::Migration.remove_column(:table_name, :column_name)
答案 18 :(得分:1)
简单来说,您可以删除列
remove_column :table_name, :column_name
例如,
remove_column :posts, :comment
答案 19 :(得分:1)
这样做吧
rails g migration RemoveColumnNameFromTables column_name:type
即rails g migration RemoveTitleFromPosts title:string
无论如何,最好还是考虑停机时间,因为ActiveRecord在运行时会缓存数据库列,因此,如果删除列,则可能会导致异常,直到应用程序重新启动为止。
答案 20 :(得分:0)
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
答案 21 :(得分:0)
只需在 rails 控制台中运行它
ActiveRecord::Base.connection.remove_column("table_name", :column_name, :its_data_type)
或
TableName.find_by_sql(“ALTER TABLE table_name DROP column_name”)