ruby-on-rails rake数据库:迁移不起作用

vsmadaxz  于 2022-12-30  发布在  Ruby
关注(0)|答案(4)|浏览(161)

我在学习rails教程时遇到了一些问题,从清单8 - 16开始,我对<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

然后,指南要求像往常一样更新开发和测试数据库:

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

我对 remember_token 的用户测试仍然失败,所以我使用命令行sqlite3查看了dev和tests数据库中的 user 表。

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");

似乎我的迁移尚未运行,但我不知道如何强制它运行。

e4yzc0pl

e4yzc0pl1#

尝试重建数据库结构(**警告:**所有数据库数据将丢失):

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

如果您使用Rails〈4.1,不要忘记准备测试数据库:

rake db:test:prepare

这是最简单的解决方案,因为您正在使用教程。但是,在生产环境中或在开发过程中有重要数据时,您应该花时间调查该问题。在这种情况下,您很可能创建了一个空迁移,运行了rake db:migrate,然后向迁移添加了指令。因此您不会看到新字段,并且rake db:migrate也不会执行任何操作。要解决此问题,您需要注解change指令,执行rake db:rollback,取消注解指令,然后使用rake db:migrate来应用您遗漏的指令。

e7arh2l6

e7arh2l62#

我遇到了和第一个问题相同的问题。$ bundle exec rake db:migrate没有将remember_token添加到. db中,Latha Doddikadi的答案对我很有效。
我做了:

rake db:rollback

然后:

$ bundle exec rake db:migrate

它将remember_token字段添加到数据库中,后跟:

bundle exec rspec spec/models/user_spec.rb

这已经过去了。

Finished in 0.92841 seconds
21 examples, 0 failures
wbgh16ku

wbgh16ku3#

回滚,然后重新运行迁移,它可能会工作。

rake db:rollback

回滚后,再次重新运行迁移。

wlwcrazw

wlwcrazw4#

我遇到了一个奇怪的情况,上次迁移只是拒绝运行。我手动创建了迁移文件。所以我删除了它,并使用

rails g migration ...

把代码复制到新文件中,然后运行了。
我没有发现为什么手动创建该文件不起作用;我所知道的是这样做的“正确/铁路的方式”解决了这个问题。
把这个留在这里以防它能帮到别人。

相关问题