我想覆盖数据库中的现有用户表。我已手动删除了迁移文件user.rb
和模型文件。之后我输入rails g model User email:string password:string
它再次创建上述文件,但是当我运行rake db:migrate
命令时,它只会给我以下错误:
rake db:migrate
== 20150413203600 CreateUsers: migrating ======================================
-- create_table(:users)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: table "users" already exists: CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar(255), "password" varchar(255), "created_at" dateti
me, "updated_at" datetime) /home/action/.gem/ruby/2.1.1/gems/sqlite3-1.3.10/lib/sqlite3/database.rb:91:in `initialize'
答案 0 :(得分:0)
如果您打开db/schema.rb
文件,则会看到您已有用户表。如果您要在另一台计算机上运行rake db:migrate
,则删除迁移文件除了不运行迁移文件之外不会执行任何操作。运行rake db:rollback
将删除您支持db:migrate的最后一件事,然后生成新的用户迁移以及rake db:migrate
。
答案 1 :(得分:0)
您不应该删除迁移文件,因为rails会使用rake db:rollback
命令下的迁移文件为您删除users表。
如果您不介意丢失所有表格,并且因为您使用的是SQLite3,则可以在db
文件夹中查找名为development.sqlite3
且可能test.sqlite3
的文件。删除它们,您根本不再拥有任何数据库表,您可以运行迁移来重新创建它们。
如果您只想删除users
表,请删除最近生成的迁移到“创建用户表”,然后创建迁移rails g migration DropUsersTable
,然后将其修改为如下所示
class DropUsersTable < ActiveRecord::Migration
def change
drop_table :users
end
end
运行迁移,这将删除现有用户表。然后,您应该删除迁移文件。正如我所说,删除迁移文件并不是一个好习惯,但在这种情况下,由于您已经销毁了创建原始用户表的迁移,因此您应该销毁丢弃该表的迁移。
此时,您没有引用users
表的迁移,并且您没有users
表,因此您现在可以生成迁移以创建它,这次它应该可以正常工作。
如果你改变主意并想再次删除用户表,请记住,不要删除迁移文件,只需执行rake db:rollback
然后根据需要调整迁移文件以创建表格,然后再次运行rake db:migrate
。