18

我有一个rails迁移没有被应用到我的schema.rb。迁移应创建一个表: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?

+3

您是否尝试先删除数据库? 'rake db:drop db:create db:migrate' – Vucko

+1

有意思的工作。 'rake db:drop db:create'与'rake db:reset'有什么不同? –

+1

'rake db:reset'运行'db:create db:schema:load db:seed'没有迁移。我认为'db:migrate:reset'将适合您的需求。 – Vucko

回答

39

documentation

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

这与运行所有迁移不同。它只会使用当前schema.rb文件的 内容。如果迁移无法回滚,则 'rake db:reset'可能无法帮助您。要了解有关倾销模式的更多信息,请参阅 'Schema Dumping and you'。

所以rake db:reset =>db:drop db:create db:schema:load db:seed

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

或者 db:migrate:reset =>rake db:drop db:create db:migrate

Reference

0

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

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

0

找到了一种获取错误描述的方法。 跑耙分贝:迁移:复位并获得

`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`' 
0

我有同样的问题......事实证明那是因为我修改了移民文件的名称,以整洁的样子。确保您不像我那样删除迁移文件标题中的时间戳。

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