需要帮助使用Rails将数据库从开发迁移到测试

时间:2012-05-08 15:44:22

标签: ruby-on-rails ruby-on-rails-3 testing rails-migrations

类似的问题已被问到很多。但是,我认为我的情况有点不同。我从Heroku(我在prod中使用sqlite3)向我的本地机器(使用PostgreSQL)中提取了一个数据库。 prod db当时没有任何数据。

在那之后,我还没有进行任何数据库迁移来测试。现在我在dev db中有几个字段。但是,当我去测试控制台看看我有什么(引用User表)时,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)

2 个答案:

答案 0 :(得分:6)

错误消息表明您的开发和测试迁移不同步。

首先在dev上运行迁移。这将使用您最近的所有迁移更新dev。

rake db:migrate

然后运行db:test:prepare。这将使测试数据库与dev相同。

rake db:test:prepare

现在,了解db:test:prepare make test与dev具有相同的模式,但没有记录。要在测试中填充记录,请实现夹具或工厂(请参阅factory-girl gem)。通常在测试中调用工厂来创建该测试的记录。

答案 1 :(得分: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