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

我有同樣的問題......事實證明那是因爲我修改了移民文件的名稱,以整潔的樣子。確保您不像我那樣刪除遷移文件標題中的時間戳。

我刪除了遷移文件,模型,控制器和相關測試,並重新生成了修復問題的控制器和模型。