2

同様の質問が多く寄せられています。しかし、私の状況は少し違うと思います。Heroku (本番環境で sqlite3 を使用) からローカル マシン (PostgreSQL を使用) にデータベースをプルしました。当時、製品データベースにはデータがありませんでした。

その後、テストのためにデータベースの移行を行っていません。これで、開発データベースにいくつかのフィールドができました。ただし、テスト コンソールにアクセスして (ユーザー テーブルを参照して) 何を持っているかを確認すると、User.count は 0 を返しますが、dev では 2 ユーザーを返します。

そのdb:migrate RAILS_ENV=testため、エラー メッセージも成功メッセージも表示されませんでした。私はそれが成功したと思い、テストデータベースをチェックして、それらの2人のユーザーがいて、まだ何もないかどうかを確認しました. それから私は試しbundle exec rake db:test:prepareました。これが出力でした

**You have 4 pending migrations:

  20120415210441 CreateUsers

  20120418064930 AddIndexToUsersEmail

  20120419034627 AddPasswordDigestToUsers

  20120504031144 AddRememberTokenToUsers

Run `rake db:migrate` to update your database then try again.**

解決策は何ですか?

編集: 参考までに: 私は Windows を使用しており、 rake db:migrateも実行し ていますが、このエラーが発生しました。

$ rake db:migrate
==  CreateUsers: migrating ====================================================
-- create_table(:users)
rake aborted!
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, "name" varchar(255), "email" varcha
(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)

Tasks: TOP => db:migrate
(See full trace by running task with --trace)
4

2 に答える 2

7

エラーメッセージは、開発とテストの移行が同期していないことを示しています。

最初にdevでmigrateを実行します。これにより、最近のすべての移行でdevが更新されます。

rake db:migrate

次に、db:test:prepareを実行します。これにより、テストデータベースがdevと同じスキーマになります。

rake db:test:prepare

ここで、db:test:prepareによってtestがdevと同じスキーマを持つようになりますが、レコードがないことを理解してください。テストでレコードを作成するには、フィクスチャまたはファクトリを実装します(factory-girlgemを参照)。通常、ファクトリは、そのテストのレコードを作成するためにテストで呼び出されます。

于 2012-05-08T15:57:51.100 に答える
1

それは別の質問と別の答えです。

テーブルを削除して、移行を再実行する必要があります。

SQLiteでテーブルを削除する方法がわからない場合は、

  1. 20120415210441_CreateUsers.rbのcreate_tableメソッド呼び出しをコメントアウトします。
  2. > rake db:migrate VERSION=20120415210441を実行します
  3. > rake db:migrate VERSION=???を実行します。どこ ???CreateUsersより前の移行のバージョンです。
  4. 20120415210441_CreateUsers.rbのコードのコメントを解除します
  5. > rake db:migrateを実行します
于 2012-05-08T16:39:52.017 に答える