Ruby on Rails – sqlite 3 rake迁移不更新数据库

我使用的是RoR(3.2.2)和SQLite 3(1.3.5)。 当我最初生成模型时,我能够成功创建数据库。 但是,每当我尝试使用迁移生成器时,它似乎在命令行中没有任何问题(没有错误),但是当我检查数据库时,没有任何更新或更改。

例如,我创建了这个数据库:

$ rails generate model User name:string email:string 

分贝/迁移/ [时间戳] _create_users.rb

 class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :name t.string :email t.timestamps end end end 

我运行迁移:

 $ bundle exec rake db:migrate 

到目前为止,我使用SQLite数据库浏览器检查我的数据库,一切看起来都应该如此。

然后,如果我想添加一个索引:

 $ rails generate migration add_index_to_users_email 

分贝/迁移/ [时间戳] _add_index_to_users_email.rb

 class AddIndexToUsersEmail < ActiveRecord::Migration def change add_index :users, :email, unique: true end end 

我运行迁移:

 $ bundle exec rake db:migrate 

命令行给了我以下内容:

bundle exec rake db:migrate == AddIndexToUsersEmail:migrating ======================================= ==== == AddIndexToUsersEmail:迁移(0.0000s)==================================

但是,当我使用SQLite数据库浏览器检查我的数据库时,它不会更新。 如果我尝试向表中添加新列等,我会得到相同的结果。我能够进行迁移的唯一方法是使用SQLite数据库浏览器手动更新数据库。 任何帮助,为什么它不通过Rails和命令行工作将不胜感激。

这是我的gemfile:

 source 'https://rubygems.org' gem 'rails', '3.2.2' gem 'bootstrap-sass', '2.0.0' group :development, :test do gem 'sqlite3', '1.3.5' gem 'rspec-rails', '2.8.1' gem 'annotate', '~> 2.4.1.beta' end group :assets do gem 'sass-rails', '3.2.4' gem 'coffee-rails', '3.2.2' gem 'uglifier', '1.2.3' end gem 'jquery-rails', '2.0.0' group :test do gem 'capybara', '1.1.2' end group :production do gem 'pg', '0.12.2' end 

database.yml的

 development: adapter: sqlite3 database: db/development.sqlite3 pool: 5 timeout: 5000 test: adapter: sqlite3 database: db/test.sqlite3 pool: 5 timeout: 5000 production: adapter: sqlite3 database: db/production.sqlite3 pool: 5 timeout: 5000 

成功添加列的示例:

  rails generate migration add_password_digest_to_users password_digest:string invoke active_record create db/migrate/20120318235656_add_password_digest_to_users.rb $ subl db/migrate/[timestamp]_add_password_digest_to_users.rb $ bundle exec rake db:migrate == AddPasswordDigestToUsers: migrating ======================================= -- add_column(:users, :password_digest, :string) -> 0.0008s == AddPasswordDigestToUsers: migrated (0.0009s) ============================== 

添加列失败的示例:

  $ rails generate migration add_remember_token_to_users invoke active_record create db/migrate/20120319010623_add_remember_token_to_users.rb $ subl db/migrate/[timestamp]_add_remember_token_to_users.rb $ bundle exec rake db:migrate == AddRememberTokenToUsers: migrating ======================================== == AddRememberTokenToUsers: migrated (0.0000s) =============================== 

注意,当它无法更新数据库时,迁移时间为零。 我不确定我做错了什么。 在此先感谢您的任何建议。

我认为发生的事情是你的语法略有错误(这是非常棘手的)然后你得到一个空的迁移,它没有做任何事情。

我会仔细检查实际的迁移文件是否添加了列。 我经常最终手动将实际更改(或上/下)放入。

正如哈里森所说,添加索引更加微妙 – 如果你刷新sqlite borwser,你肯定它不会被添加。 你给出的有用的例子……是添加列…

我解决了撤消上次迁移的问题

 rails destroy migration add_index_to_users_email 

然后我关闭了终端以确保所有数据库连接都已关闭,然后我运行

 rake db:reset 

最后,再次运行相同的命令

 rails generate migration add_index_to_users_email 

使用相同内容更新文件并运行

 rake db:migrate 

之前没有工作的所有相同命令和文件现在都可以使用(对我而言)。

我希望这对你也有用。

您从添加索引示例中发布的输出显示迁移确实正在运行…但您报告它实际上没有执行任何操作。 尝试bundle exec rake:db rollback (可选STEP=n后退一步)。 这真的应该“正常工作”,索引的情况可能有点微妙 – 尝试添加一个列或其他东西(你说你已经完成了,但是,只是为了确定)。 它真的不起作用吗? 你怎么知道?