8

对我来说,创建模型、运行迁移、销毁它并再次创建相同的模型报告 SQL 异常,这对我来说似乎很奇怪:

project|master ⇒ rails g model name name
      invoke  active_record
      create    db/migrate/20130417185814_create_names.rb
      create    app/models/name.rb
project|master⚡ ⇒ rake db:migrate
==  CreateNames: migrating ====================================================
-- create_table(:names)
   -> 0.0020s
==  CreateNames: migrated (0.0021s) ===========================================
project|master⚡ ⇒ rails d model name
      invoke  active_record
      remove    db/migrate/20130417185814_create_names.rb
      remove    app/models/name.rb
project|master⚡ ⇒ rake db:migrate
project|master⚡ ⇒ rails g model name test
      invoke  active_record
      create    db/migrate/20130417185845_create_names.rb
      create    app/models/name.rb
project|master⚡ ⇒ rake db:migrate
==  CreateNames: migrating ====================================================
-- create_table(:names)
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: table "names" already exists: CREATE TABLE "names" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "test" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) /path/project/db/migrate/20130417185845_create_names.rb:3:in `change'
-- create_table("names", {:force=>true})
   -> 0.0100s
-- initialize_schema_migrations_table()
   -> 0.0025s
-- assume_migrated_upto_version(20130417185814, ["/path/project/db/migrate"])
   -> 0.0010s
You have 1 pending migrations:
  20130417185845 CreateNames
Run `rake db:migrate` to update your database then try again.

也许,我做错了什么?迁移有删除表的代码 - 它是否只能用于回滚?

解决方案

删除模型和数据库表并生成一个新表非常简单:

  1. 创建模型:rails g model user name
  2. 进行迁移:rake db:migrate
  3. 实现一个东西,突然想起需要删除模型
  4. 还原特定迁移:rake db:migrate:down VERSION=2013041718581420130417185814迁移id在哪里(可以在rake db:migrate:status中看到)
  5. 移除模型:rails d model user
  6. 突然想起你需要这个模型,但是还有其他字段
  7. 创建模型:rails g model user email group:references
  8. 成功迁移数据库:rake db:migrate
4

3 回答 3

9
rails d model name 

这只是删除模型而不是您运行的迁移(在数据库中创建了表)。

如果要删除模型和表,则必须执行以下操作

rake db:rollback 
rails d model name
于 2013-04-17T19:23:57.097 回答
4

您删除了模型——这是与回滚迁移不同的操作。

销毁模型正是这样做的,而且仅仅是这样做的;它与迁移无关。

于 2013-04-17T19:19:40.647 回答
0

根据您的迁移错误,迁移文件肯定有问题,而且是指创建名称表的文件。

请查看此文件,查看您的更改方法。

迁移文件中的 change 方法应该执行 DB 代码,该 DB 代码可以在 DB 上执行一些操作,并且更改的相同代码应该是正确的回滚。

如果您想将两者分开,您应该将代码放在将对数据库执行操作的 up 方法上,并在 down 方法上执行相反的滚动操作。

我建议您删除迁移中的所有文件,包括导致问题的文件,并正确写入。

如果您需要帮助,请发布您的迁移文件。

另请查看指南: http: //guides.rubyonrails.org/migrations.html

于 2013-04-17T20:01:36.867 回答