Rails中如何删除数据表?

Rails 基础知识补充。

问题描述

先看个场景:

当你运行rake db:migrate时,终端报错:

SQLite3::SQLException: table "XXXX" already exists……

这种情况下,多半由于你重建了tableXXXX导致,针对这种情况,一般有两种方法可以解决:

  • 查看你需要migrate的代码,是否存在重建tableXXXX的情况,如果有,注释掉,然后再run rake db:migrate
  • 删除掉数据库中已经存在的table XXXX,再run rake db:migrate, 重建新的table XXXX。 「特别是当你对先前建的table并不满意时」

第一种很好办,没啥可说的,看第二种具体怎么做。

解决方法

以table projects为例,含字段title,description。

两种方法:

一个简单粗暴的方式是rails c,打开rails console,运行:

ActiveRecord::Migration.drop_table(:projects) #将projects换成你要删除的表名

另一个方式先注释掉需要migration的代码,然后新建一个migration:rails g migration Dropprojects

在生成的xxxxxx_Dropprojects.rb中填入以下内容:

class Dropprojects < ActiveRecord::Migration
  def change
    drop_table :projects do |t|
      t.string :title, null: false
      t.text :description, null: false
      t.timestamps null: false
    end
  end
end

终端run rake db:migrate, 成功删除, 这应该算是比较 “officials” 的做法了。

删除后,再取消你先前注释的需要migration的代码,运行rake db:migrate, 重建新的table。

此外,当你在Rails中添加了一个table XXXX,发现后续并不需要这个table了,也可以通过上诉的方式删除它。

当然,大部分情况下,不建议动数据库的,因为多个table之间可能存在关联,删除可能引发潜在的问题。

参考

Active Record Migrations

Rails DB Migration - How To Drop a Table?