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 に答える
0

移行エラーによると、移行ファイルに何か問題があるに違いありません。さらに、名前テーブルの作成を参照しているものもあります。

あなたの変更方法で、このファイルを見てください。

移行ファイルの変更メソッドはDBコードを実行することになっています。そのDBコードはDBでいくつかの操作を行うことができ、変更の同じコードはロールバックを行うのに正しいはずです。

2つを分離したい場合は、DBで操作を実行するupメソッドにコードを配置し、逆のローリング操作を実行するdownメソッドにコードを配置する必要があります。

問題の原因となっているファイルを含め、移行中のすべてのファイルを削除し、それらを正しく書き込むことをお勧めします。

助けが必要な場合は、移行ファイルを投稿してください。

ガイドもご覧ください: http://guides.rubyonrails.org/migrations.html

于 2013-04-17T20:01:36.867 に答える