如何使用Rails迁移删除列

时间:2010-05-14 00:02:55

标签: ruby-on-rails ruby database activerecord rails-migrations

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

22 个答案:

答案 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,如下所示:

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

答案 5 :(得分:13)

在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

答案 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)

您可以尝试以下操作:

remove_column :table_name, :column_name

Official documentation

答案 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 5.2的简单明了说明

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


1。创建迁移

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

rails generate migration remove_fieldname_from_tablename fieldname:string

  • 注意:表名应按照rails约定为复数形式。

示例:

  • 对于我来说,我想从accepted表中删除quotes列(一个布尔值):

rails g migration RemoveAcceptedFromQuotes accepted:boolean

  

有一个特殊的语法捷径可以生成添加   表中的字段。

     

rails生成迁移add_fieldname_to_tablename fieldname:string

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

...。然后您就可以参加比赛了!

答案 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个步骤即可从表中删除列,如下所示:

  1. 编写此命令
  2. rails g migration remove_column_from_table_name

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

    然后转到此文件。

    1. 你必须写的文件

      remove_column :table_name, :column_name

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

      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在运行时会缓存数据库列,因此,如果删除列,则可能会导致异常,直到应用程序重新启动为止。

参考:Strong migration

答案 20 :(得分:0)

  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

答案 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”)