Rails迁移不会更改schema.rb

时间:2013-12-09 07:00:16

标签: ruby-on-rails ruby-on-rails-4 database-migration rails-migrations

我的rails迁移未应用于schema.rb。迁移应该创建一个表:

class CreateUserGraphs < ActiveRecord::Migration
  def change
    create_table :user_graphs do |t|
      t.string :name
      t.string :content
      t.integer :user_id
      t.string :type_id
      t.integer :upload_id

      t.timestamps
    end

    add_index :user_graphs, [:user_id, :created_at]
  end
end

我做了db:reset。然后我尝试了rake db:migrate:up VERSION = 123123123(这是迁移#)。我在“开发”环境中。

为什么迁移不会影响schema.rb?

6 个答案:

答案 0 :(得分:48)

来自documentation

rake db:reset任务将删除数据库,重新创建它并将当前架构加载到其中。

  

这与运行所有迁移不同。它只会使用   当前schema.rb文件的内容。如果无法回滚迁移,   'rake db:reset'可能对你没用。要了解有关转储模式的更多信息,请参阅   '架构转储和你。'

所以rake db:reset =&gt; db:drop db:create db:schema:load db:seed

要运行所有迁移,请使用: rake db:drop db:create db:migrate

或者 db:migrate:reset =&GT; rake db:drop db:create db:migrate

Reference

答案 1 :(得分:1)

迁移的'版本'是通过时间戳完成的。 Rails通过比较上次运行迁移的时间戳并查看是否有更新的迁移来检查需要运行的迁移。

如果新迁移的版本为123123123,则不会运行该版本,因为该数字不大于当前时间戳(例如20131209170300)。

答案 2 :(得分:1)

我遇到了同样的问题......事实证明这是因为我编辑了我的迁移文件的名称看起来更整洁。确保不要像我一样删除迁移文件标题中的时间戳。

我删除了迁移文件,模型,控制器和相关测试,并重新生成了修复问题的控制器和模型。

答案 3 :(得分:1)

我有同样的问题。我在开发环境(使用Passenger和Apache)工作。生产和开发环境使用相同的数据库。

当我运行rake db:migrate时,数据库已更改,但架构未更新。然后我运行rake db:migrate RAILS_ENV=development,现在架构已更新。

似乎rails / rake对我的环境感到困惑。 Passenger为此站点设置了开发环境,但rake about表示“环境生产”。

答案 4 :(得分:1)

首先,您尝试降低迁移率

rake db:migrate:down VERSION = 20180605141404#“VERSION = 20180605141404您的迁移版本”

再次启动迁移

rake db:migrate:up VERSION = 20180605141404#“VERSION = 20180605141404您的迁移版本”

答案 5 :(得分:0)

找到获取错误描述的方法。 运行rake db:migrate:reset和received

`SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "rooms" ADD "priority" integer NOT NULL/usr/local/rvm/gems/ruby-2.2.1/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `initialize`'