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之间可能存在关联,删除可能引发潜在的问题。