rake db:migrate is not working

2020-02-08 08:00发布

问题:

I'm working through the rails tutorial and have gotten stuck. Starting at Listing 8.16 I have made the following modifications to <timestamp>_add_remember_token_to_users.rb:

class AddRememberTokenToUsers < ActiveRecord::Migration
  def change
    add_column :users, :remember_token, :string
    add_index  :users, :remember_token
  end
end

The guide then says to update dev & test db as usual:

$ bundle exec rake db:migrate
$ bundle exec rake db:test:prepare

My User test for the *remember_token* is still failing so I took a look at the user table in dev and tests database with command line sqlite3. They look like this:

sqlite> .schema users
CREATE TABLE "users" (
   "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
   "name" varchar(255), 
   "email" varchar(255), 
   "created_at" datetime NOT NULL, 
   "updated_at" datetime NOT NULL, 
   "password_digest" varchar(255));
CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email");

It seems like my migration has not been run yet but I do not know how to force it to run.

回答1:

Try to rebuild your database structure(WARNING: all db-data will be lost):

rake db:drop:all
rake db:create:all
rake db:migrate

If you use Rails < 4.1, don't forget to prepare test database:

rake db:test:prepare

This is the easiest solution since you are working with tutorial. However in production or having important data in development you should take time to investigate the issue. In this case you most likely had created an empty migration, ran rake db:migrate, then added instructions to the migration, so you don't see a new field and further rake db:migrate does nothing. To resolve this issue you need to comment your change instructions, perform rake db:rollback, uncomment instructions and then rake db:migrate to apply instructions you missed.



回答2:

I had the same issue as the initial question. $ bundle exec rake db:migrate wasn't adding remember_token to the .db and Latha Doddikadi's answer worked for me.

I did:

rake db:rollback

and then:

$ bundle exec rake db:migrate

which added the remember_token field to the database followed by:

bundle exec rspec spec/models/user_spec.rb

which passed.

Finished in 0.92841 seconds
21 examples, 0 failures


回答3:

Roll back and then re run the migration it might work.

     rake db:rollback

And after rolling back re run your migrations again.