【问题标题】:Ruby on Rails - sqlite 3 rake migrations not updating the databaseRuby on Rails - sqlite 3 rake 迁移不更新数据库
【发布时间】:2012-04-03 12:49:56
【问题描述】:

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

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

$ rails generate model User name:string email:string

db/migrate/[时间戳]_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

db/migrate/[时间戳]_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: 迁移 =========================================== == 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

数据库.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) ===============================

请注意,当更新数据库失败时,迁移时间为零。我不确定我做错了什么。提前感谢您的任何建议。

【问题讨论】:

    标签: ruby-on-rails database ruby-on-rails-3 sqlite database-migration


    【解决方案1】:

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

    【讨论】:

    • 是的,这很奇怪。有时它可以添加列,有时它不会。我注意到的一件事,它不起作用的时间迁移的时间总是 0.0000 秒,而当它起作用时,有一段时间过去了(即 0.0009 秒)。我成功添加了列password_digest,但添加列remember_token失败(我将在上面添加这些示例)。
    • 根据我对 Michael Durant 的回答的评论——第一个示例为 Rails 提供了足够的信息来生成迁移文件和必要的代码;第二个没有。
    【解决方案2】:

    我认为发生的情况是您的语法稍有错误(这非常棘手),然后您会得到一个没有任何作用的空迁移。

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

    正如哈里森所说,添加索引更加微妙 - 因为如果您刷新 sqlite 浏览器,您确定它不会被添加。您提供的有效示例...是添加列...

    【讨论】:

    • 我做了一些测试,如果我将$rails generate migration add_remember_token_to_users 更改为$rails generate migration add_remember_token_to_users remember_token:string,那么它可以工作。不过,我仍然不确定索引上的正确语法。那些仍然不适合我。上面的 add_index 示例来自 [ruby.railstutorial.org/book/…,但我无法让它真正出现在数据库中。
    • 生成迁移通常只创建一个具有特殊名称的文件,以及一个类的外壳和一些空方法;在某些情况下,它还可以根据您提供的名称生成代码。检查迁移文件(app/db/migrate/)——通常你必须手动添加代码。这在guides.rubyonrails.org/migrations.html 上都有很好的记录
    【解决方案3】:

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

    rails destroy migration add_index_to_users_email
    

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

    rake db:reset 
    

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

    rails generate migration add_index_to_users_email
    

    更新相同内容的文件并运行

    rake db:migrate
    

    以前不工作的所有相同命令和文件现在都工作了(对我来说)。

    我希望这也适用于你。

    【讨论】:

    • 谢谢!这很有帮助
    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2023-04-03
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多